0

私はiOS開発に少し慣れていません。これらのメソッドを2つの別々のビューコントローラー(マスタービューコントローラーとエディタービューコントローラー)で宣言および実装しており、エディターからマスターにデータを渡す必要があります。マスターには、適切な名前で更新する必要があるテーブルビューが含まれています。(注: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

これは、問題を修正するために必要と思われるコードです。明らかに、実装の残りの部分にはデフォルトのオーバーライドされたメソッドがあります。

これは、エディタービューコントローラーのコードです。考えが表示されたら、はい、「完了」ボタンはメインストーリーボードの-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の形式でいくつかの値を取得し、そのクラスのオブジェクトを介してマスタービューコントローラーに渡します。繰り返しますが、上部のナビゲーションバーの[完了]ボタンをクリックすると、エディタービューコントローラーが閉じられますが、取得した値でテーブルビューが更新されません。

助けていただければ幸いです。:)

4

1 に答える 1

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 のインスタンスを持っているので、新しいインスタンスを作成してデータを渡し、前のインスタンスが詳細な値を更新することを期待してはいけません。

委任パターンを使用する必要があります。

でプロトコルを作成しますFTEditorControllerObjective-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];

}
于 2013-03-09T18:59:08.617 に答える