-1

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

主视图控制器:

- (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)];

}

主子视图.h

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

但是,我在将数据从我的表视图传递到子视图中的“dishName”并设置“mainTitle”=“dishName”时遇到了麻烦任何人都可以帮助我吗?

谢谢!

4

3 回答 3

0

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

MainSubView *mainSV = [[MainSubView alloc] initWithMyCustomData:(NSDictionary *)dictionaryObject andAnArray:(NSArray *)array andAString:(NSString *)string andANumber:(NSNumber *)aNumber;
于 2013-03-19T23:43:40.457 回答
0

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

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

mainSubModalPanel.myProperty = myString;

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

于 2013-03-19T23:53:42.857 回答
0

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

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

现在你应该可以设置dishNameand了mainTitletext

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

然后将其添加为子视图以及上面的任何其他内容(我喜欢在传递所有权之前完全设置一个对象,因为它往往会导致更少的故障)


小注:

您的NSString *dishName财产可能会更好有copy修饰符而不是retain. 具有可变子类型的基础类型(即 NSString 具有 NSMutableString 子类)需要传递一个可以从外部更改的可变子类。通常,这不是您想要的并且会导致错误(当然,除非您明确要求 NSMutableString),并且 usingcopy确保您传递的任何内容都保持这种状态:

@property (nonatomic, copy) NSString *dishName;

此外,如果您计划使用 MainSubView 的mainTitle.textmatch dishName,您可能需要考虑指定一个自定义 setter 方法来自动dishName设置,mainTitle.text如下所示:

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

        mainTitle.text = dishName;
    }
}
于 2013-03-20T00:29:33.703 回答