将数据从UIViewController传递到UIView

时间:2013-03-19 23:31:17

标签: ios uitableview uiview uiviewcontroller

我在UIViewController中有一个表,我还有一个子视图,它是UIView。 我试图将数据从我的UIViewController传递到UIView:

MainViewController:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UAModalPanel *mainSubModalPanel = [[[MainSubView alloc] initWithFrame:self.view.bounds] autorelease];
    [self.view addSubview:mainSubModalPanel];
    [mainSubModalPanel showFromPoint:CGPointMake(384.5, 512.5)];

}

MainSubView.h

@interface MainSubView : UAModalPanel
{
    NSString *dishName;
}
@property (strong, nonatomic) IBOutlet UILabel *mainTitle;
@property (nonatomic, retain) NSString *dishName;

然而,我在子视图中将数据从我的表视图传递到“dishName”时遇到了麻烦,并设置了“mainTitle”=“dishName” 有人可以帮帮我吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

将init方法调整为传递数据的init方法。

MainSubView *mainSV = [[MainSubView alloc] initWithMyCustomData:(NSDictionary *)dictionaryObject andAnArray:(NSArray *)array andAString:(NSString *)string andANumber:(NSNumber *)aNumber;

答案 1 :(得分:0)

看起来你已经将UIView子类化并称之为MainSubView。现在,向子类添加一些属性,并从视图控制器中设置它们。

请确保在UIViewController的.h文件中包含自定义UIView的.h文件。

mainSubModalPanel.myProperty = myString;

然后,由于您在代码中创建自定义UIView,不要忘记将其添加为UIViewController的子视图:

答案 2 :(得分:0)

首先,您将新分配的MainSubView存储在UAModalPanel指针中,尽管您需要访问的属性是MainSubView子类的一部分。尝试将MainSubView初始化更改为:

    MainSubView *mainSubModalPanel = [[[MainSubView alloc] initWithFrame:self.view.bounds] autorelease];

现在您应该可以设置dishNamemainTitle的{​​{3}}:

    mainSubModalPanel.dishName = @"Pizza!";
    mainSubModalPanel.mainTitle.text = @"Moar Pizza!";

然后将其添加为子视图以及上面的其他内容(我喜欢在传递所有权之前完全设置对象,因为它可以减少故障)


次要说明:

拥有NSString *dishName修饰符而不是copy可能会更好retain属性。具有可变子类型的基础类型(即NSString具有NSMutableString子类)需要传递一个可以从外部更改的可变子类。一般来说,这不是你想要的,并导致错误(当然,除非你明确要求NSMutableString),并使用copy确保你通过的任何东西都留下来那样:

@property (nonatomic, copy) NSString *dishName;

另外,如果您计划让MainSubView的mainTitle.text匹配dishName,您可能需要考虑为dishName指定一个自动设置mainTitle.text的自定义setter方法像这样:

- (void)setDishName:(NSString *)newDishName
{
    BOOL notTheSameStringInstance = (newDishName != dishName);
    BOOL notIdenticalStringContents = ![newDishName isEqualToString:dishName];
    if (notTheSameStringInstance && notIdenticalStringContents) {
        [dishName release];
        dishName = [newDishName copy];

        mainTitle.text = dishName;
    }
}
相关问题