我对iOS开发有点新意。我在两个独立的视图控制器(主视图控制器和编辑器视图控制器)中声明和实现了这些方法,并且需要将数据从编辑器传递到主控制器。主服务器包含一个表视图,需要使用适当的名称进行更新。 (注意:我使用了iPhone的默认主 - 详细信息应用程序模板。我没有使用单视图应用程序手动创建它)
目前,MasterViewController内的UITableView不会使用新单元格进行更新。对我来说这是一个忙碌的一周,我必须要错过一些东西。这是主视图控制器的代码:
@implementation FTMasterViewController
@synthesize bPlusMinusField, cPlusMinusField, cTerm, bTerm;
-(void) passTrinomial:(CCTrinomial *)tri withBPlusMinusField:(NSString *)bField withBTerm:(double)bTermField withCPlusMinusField:(NSString *)cField withCTerm:(double)cTermField {
//allocate the array
if (!self.trinomials) {
self.trinomials = [[NSMutableArray alloc] init];
}
//set Master VC properties to tri fields passed in
self.bPlusMinusField = bField;
self.cPlusMinusField = cField;
self.bTerm = bTermField;
self.cTerm = cTermField;
NSString *trinomial = [NSString stringWithFormat:@"x² %@ %g %@ %g", bPlusMinusField, bTerm, cPlusMinusField, cTerm];
[self.trinomials insertObject:trinomial atIndex:0];
NSLog(@"%lu", (unsigned long)[self.trinomials count]);
}
#pragma mark - Table View
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.trinomials count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"x² %@ %g %@ %g", bPlusMinusField, bTerm, cPlusMinusField, cTerm];
return cell;
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showDetail"]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
NSDate *object = _objects[indexPath.row];
[[segue destinationViewController] setDetailItem:object];
}
}
@end
这是我认为解决问题所需的代码:显然,我在其余的实现中都有默认的重写方法。
这是Editor View Controller代码。当你想到这个想法时,是的,“完成”按钮链接到我的主故事板中的-handleDoneButtonPushed:方法。
-(IBAction)handleDoneButtonPushed:(id)sender {
[self dismissViewControllerAnimated:YES completion:NULL];
FTMasterViewController *masterVC = [[FTMasterViewController alloc] init];
[masterVC passTrinomial:factoring withBPlusMinusField:bPlusMinusField.text withBTerm:[bTriField.text doubleValue] withCPlusMinusField:cPlusMinusField.text withCTerm:[cTriField.text doubleValue]];
}
这个编辑器视图控制器只是以UITextField的形式获取一些值,并通过该类的对象将它们移交给主视图控制器。同样,当我单击顶部导航栏上的“完成”按钮时,它会关闭编辑器视图控制器,但不会使用检索到的值更新表视图。
非常感谢帮助。 :)
答案 0 :(得分:0)
-(IBAction)handleDoneButtonPushed:(id)sender { [self dismissViewControllerAnimated:YES completion:NULL]; FTMasterViewController *masterVC = [[FTMasterViewController alloc] init]; [masterVC passTrinomial:factoring withBPlusMinusField:bPlusMinusField.text withBTerm:[bTriField.text doubleValue] withCPlusMinusField:cPlusMinusField.text withCTerm:[cTriField.text doubleValue]]; }
这是错误的,你已经有一个MasterViewController实例,你不应该实例化一个新实例,传递数据并期望前一个更新详细值。
您应该使用委托模式。
在FTEditorController
中创建协议。关于实施Delegates in Objective-C
@protocol FTEditorControllerDelegate <NSObject>
@optional
- (void)editorController:(FTEditorViewController *)editorController didCompleteEditingTrinomial:(NSString *)trinomial;
@end
当您将MasterController设置为EditorController的委托时,一旦在EditorController中发生了感兴趣的事件,它就会将该事件提供给其委托。
因此,一旦完成创建三项式表达式,就将其传递给MasterController。
-(IBAction)handleDoneButtonPushed:(id)sender
{
[self dismissViewControllerAnimated:YES completion:NULL];
NSString *trinomial = [NSString stringWithFormat:@"x² %@ %g %@ %g", bPlusMinusField.text, [bTriField.text doubleValue], cPlusMinusField.text, [cTriField.text doubleValue]];
if([self.delegate respondsToSelector:@selector(editorController:didCompleteEditingTrinomial:)])
{
[self.delegate editorController:self didCompleteEditingTrinomial:trinomial];
}
}
//FTEditorControllerDelegate implementation in MasterViewController
- (void)editorController:(FTEditorViewController *)editorController didCompleteEditingTrinomial:(NSString *)trinomial{
//allocate the array
if (!self.trinomials) {
self.trinomials = [[NSMutableArray alloc] init];
}
//This condition is tricky, I assume you always want to display the edited
//trinomial expression as the first one in tableView
[self.trinomials insertObject:trinomial atIndex:0];
//Reloads the tableView to reflect the changes
[self.tableView reloadData];
}