当按下UIAlertView按钮时,如何在tableView中重新加载数据?

时间:2012-04-19 03:28:08

标签: iphone objective-c ios cocoa-touch

我在UITableView中有一个名单。 tableView的委托是一个viewController。我使用IBAction来调用UIAlertView(带有文本字段),以便用户可以向tableView添加另一个名称:

- (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 个答案:

答案 0 :(得分:1)

每个视图控制器都有一个视图。表视图的委托控制器视图是否为表视图?如果是这样,请尝试:

[((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

答案 1 :(得分: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 

注意:别忘了将委托和数据源设置为tableview到viewcontroller

答案 2 :(得分:0)

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

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

[tableviewName reloadData]; } }

答案 3 :(得分:0)

为表视图创建一个插座,在界面构建器

中连接它

在.h

IBOutlet UITableView *exercisesTable;
.m类中的

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



    }
    else if (buttonIndex == 1)
    {
        // your code
        [exercisesTable reloadData];
    }
}