【问题标题】:Passing data from UIViewController to UIView将数据从 UIViewController 传递到 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”时遇到了麻烦 谁能帮帮我?

谢谢!

【问题讨论】:

    标签: ios uitableview uiview uiviewcontroller


    【解决方案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 的子视图:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-01
        • 2018-04-18
        • 1970-01-01
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        相关资源
        最近更新 更多