我在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” 有人可以帮帮我吗?
谢谢!
答案 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];
现在您应该可以设置dishName
和mainTitle
的{{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;
}
}