我有一个简单的push segue,从一个UITableViewController到另一个。在启动另一个UITableViewController时,我想传递一个id,用于执行sqlite查询并填充表。我可以使用公共属性并在自定义setter中重新加载表,但如果在启动时完成设计似乎更好。经过一段时间的搜索,我找不到任何明确的例子。我看到了initWithCoder
和initWithFrame
的提及,但他们还不够清楚,无法将其与我想要做的事情联系起来。
以下是第一张表格中的segue:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"ShowFlashcards"]) {
//pass variable to custom init somewhere around here?
FlashcardsTableViewController *flashcardsTableViewController = [segue destinationViewController];
}
}
以下是自定义init的样子:
@property (nonatomic, strong) NSNumber *listId;
@property (nonatomic, strong) NSArray *flashcards;
- (id)initWithListId:(NSNumber *)listId {
self = [super init];
if (self ) {
self.listId = listId;
Database *db = [[Database alloc] init];
self.flashcards = [db getWordsFromList:[listId integerValue]];
}
return self;
}
答案 0 :(得分:2)
你过度思考这个问题,并得出了一些错误的结论。
将属性添加到目标VC(视图控制器)并在prepareForSegue中设置它正是您想要做的。
在这种情况下,您无法使用自定义初始化。调用segue会分配和初始化目标VC(实际上,我相信它是使用initWithCoder方法创建的。)当调用prepareForSegue时,目标VC的视图尚未加载,因此您可以设置属性并设置它们到目的地VC的viewDidLoad方法被调用时。
@ AJHacker的答案显示了如何为目标VC提供指向源VC的指针,这在目标需要能够发回数据时非常有用。
答案 1 :(得分:0)
您需要将包含第一个视图引用的属性添加到第二个视图中。例如:
@interface AutoRenewDrop
@property(weak, nonatomic) AddR *callerView;
@end
然后在第二个视图的'done'方法中,你可以像这样更新调用者视图中的变量:
-(IBAction)done:(UIStoryboardSegue *)segue {
[self.navigationController popViewControllerAnimated:YES];
callerView.renewDate.text = transferData;
}
当然,当您启动第二个视图时,您必须设置引用,如下所示:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"Check Mark Segue"])
{
NSLog(@"Transfering Data");
AutoRenewDrop *controller = segue.destinationViewController;
controller.transferData = self.renewDate.text;
controller.callerView = self; //Here, you are passing the reference to this View
}
}
希望有所帮助