1

に名前のリストがありますUITableView。tableView のデリゲートは viewController です。ユーザーが別の名前を tableView に追加できるように、 (テキスト フィールドを使用して)IBActionを呼び出すために を使用します。UIAlertView

- (IBAction)addGuest:(UIButton *)sender
{   
    // open a alert with text field, cancel and add button
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Add New Guest" message:@"Example: John Doe" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil];

    alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    [alert show];
}

ユーザーが の [追加] ボタンをクリックするUIAlertViewと、テキスト フィールドの情報が plist に書き込まれます。

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 1) {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsPath = [paths objectAtIndex:0];
        NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Guests.plist"];

        [self.guestList addObject:[[alertView textFieldAtIndex:0] text]];

        NSMutableDictionary *plistDict = [NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:guestList, nil] forKeys:[NSArray arrayWithObjects:@"nameList", nil]];
        NSString *error = nil;
        NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
        if (plistData) {
            [plistData writeToFile:plistPath atomically:YES];
        } else {
            NSLog(@"Error in saveData: %@", error);
        }
    }
}

この時点で、(上記のメソッド内で) tableView をリロードして、新しく追加された名前が表示されるようにします。UIAlertViewのデリゲートを自分自身に設定しました。

ただし、[self.tableView reloadData]このメソッドでは tableView が認識されないため機能しません。さまざまなバリエーションを試しましたが、何も機能しません。

これを行うにはどうすればよいですか?

ありがとうございました!

4

4 に答える 4

1

すべてのView Controllerにはビューがあります。テーブル ビューのデリゲート コントローラーのビューはテーブル ビューですか? その場合は、次を試してください。

[((UITableView *) self.view) reloadData]

didDismissWithButtonIndex メソッドの実装で。上記は、tableView のデリゲート コントローラーがUIAlertView のデリゲートでもある場合にのみ機能します。あなたはそれを達成するでしょう: `

@interface SomeViewController : UIViewController
    <UITableViewDataSource,
      UITableViewDelegate,
      UIAlertViewDelegate> { /* .... */ }  /* ... */ @end

またはそれ以上 (ただし、常に可能であるとは限りません):

@interface SomeViewController : UITableViewController      // <- Now you'll have self.tableView 
    < UIAlertViewDelegate> { /* .... */ } /* ... */ @end
于 2012-04-19T03:47:23.360 に答える
0

テーブルビューのアウトレットを作成し、インターフェースビルダーで接続します

.h で

IBOutlet UITableView *exercisesTable;

.m クラスで

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 0)
    {   



    }
    else if (buttonIndex == 1)
    {
        // your code
        [exercisesTable reloadData];
    }
}
于 2012-04-19T11:05:31.640 に答える
0

[tableview reloadData] メソッドを使用するには、

uitableviewdelegate,uitabbleviewdatasource     
reloadData works only if you implement the  following three delegate methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

- (IBAction)addGuest:(UIButton *)送信者を使用する代わりに 、デリゲート メソッドを使用できます

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

注意:デリゲートとデータソースをビューコントローラーにテーブルビューに設定することを忘れないでください

于 2012-04-19T05:21:43.307 に答える
0

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ NSString *buttonTitle=[alertView buttonTitleAtIndex:buttonIndex];

if ([buttonTitle isEqualToString:@"Add"]) {

[tableviewName reloadData]; } }

于 2012-04-19T08:56:55.553 に答える