将数据从 UIViewController 传递到 UIView

Posted

技术标签:

【中文标题】将数据从 UIViewController 传递到 UIView【英文标题】:Passing data from UIViewController to UIView 【发布时间】:2013-03-19 23:31:17 【问题描述】:

我在 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)];


MainSubView.h

@interface MainSubView : UAModalPanel

    NSString *dishName;

@property (strong, nonatomic) IBOutlet UILabel *mainTitle;
@property (nonatomic, retain) NSString *dishName;

但是,我在将数据从表视图传递到子视图中的“dishName”并设置“mainTitle”=“dishName”时遇到了麻烦 谁能帮帮我?

谢谢!

【问题讨论】:

【参考方案1】:

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

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

现在您应该可以设置dishNamemainTitletext

    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,如下所示:

- (void)setDishName:(NSString *)newDishName

    BOOL notTheSameStringInstance = (newDishName != dishName);
    BOOL notIdenticalStringContents = ![newDishName isEqualToString:dishName];
    if (notTheSameStringInstance && notIdenticalStringContents) 
        [dishName release];
        dishName = [newDishName copy];

        mainTitle.text = dishName;
    

【讨论】:

好。很高兴能够提供帮助。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

看起来您已经继承了 UIView 并将其命名为 MainSubView。现在,向您的子类添加一些属性并从视图控制器中设置它们。

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

mainSubModalPanel.myProperty = myString;

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

【讨论】:

以上是关于将数据从 UIViewController 传递到 UIView的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 如何将数据从 UITableViewCell 类传递到 UIViewController

使用 swift 将数据从 UITabBarView 类传递到 UIViewController 的子类

如何将数据从基于 plist 的 UITableView 传递到 UIViewController

我需要使用数组将数据从 UITableViewController 传递到 UIViewController

将信息从 UINavigationController 传递到嵌入式 UIViewController

将数据从 UIViewControllerRepresentable 传递给 UIViewController