动态更改UITableView的内容

时间:2009-07-15 13:58:03

标签: iphone objective-c

我有一个NSURL对象,它根据用户输入搜索栏的变量从我的网站获取数据。

我将这些数据拆分为NSArray。

完成后我希望在UITableView中显示数据。

我的问题是这个。是否可以动态地将数据加载到UITableView中?

即。程序加载,没有数据,因此UITableView为空,然后用户搜索一个变量。获取一些数据,并将内容加载到UITableView中。搜索新变量,从UITableView清除旧数据并添加新数据?

我目前正在尝试使用界面构建器执行此操作,但担心我可能必须以实用方式创建我的界面,以便我可以销毁并重新创建UITableView,但我不确定。

感谢您的帮助。

3 个答案:

答案 0 :(得分:8)

确定UITableView上的reloadData方法可以解决这个问题

答案 1 :(得分:3)

不用担心,继承UITableView很容易。在xCode中只需选择新文件,选择“Cocoa Touch Classes”,“Objective-c class”并在“Subclass of”下拉选择“UITableView”中。 xCode将添加一个UITableViewController子类,其中包含要构建的存根。

我填写了一个非常简单的示例,它从数组中提取表数据,并从Application Delegate中显示。正如您建议向UITableView发送reloadData消息将刷新显示的数据。

正如您可能已经发现的那样,使用InterfaceBuilder进行此项工作比以编程方式进行操作要困难得多。

干杯,niels

//
//  MyTableViewController.m
//  TableView
//
//  Created by Niels Castle on 7/15/09.
//  Copyright 2009 Castle Andersen ApS. All rights reserved.
//

#import "MyTableViewController.h"


@implementation MyTableViewController

// Initializer do custom initialisation here
- (id)initWithStyle:(UITableViewStyle)style {
    if (self = [super initWithStyle:style]) {

      // This is the source of my data. The simplest source possible,
      // an NSMutableArray, of name. This would be the data from your web site
       array = [[NSMutableArray alloc]
        initWithObjects:@"Niels", @"Camilla", @"William", nil];
    }
    return self;
}


// How many section do we want in our table
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


// Customize the number of rows in the table view
// Simply the number of elements in our array of names
- (NSInteger)tableView:(UITableView *)tableView
    numberOfRowsInSection:(NSInteger)section {
    return [array count];
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView
    cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   // Reuse cells 
   static NSString *id = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:id];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc]
            initWithStyle: UITableViewCellStyleDefault
            reuseIdentifier:CellIdentifier] autorelease];
    }

   // Simplest possible cell - displaying a name from our name array
   [[cell textLabel] setText: [array objectAtIndex:[indexPath row]]];

    return cell;
}

- (void)dealloc {
   [super dealloc];
   [array release];
}

@end


//
//  TableViewAppDelegate.m
//  TableView
//
//  Created by Niels Castle on 7/15/09.
//  Copyright Castle Andersen ApS 2009. All rights reserved.
//

#import "TableViewAppDelegate.h"
#import "MyTableViewController.h"

@implementation TableViewAppDelegate

@synthesize window;


- (void)applicationDidFinishLaunching:(UIApplication *)application {    

   MyTableViewController *twc = [[MyTableViewController alloc]
      initWithStyle: UITableViewStylePlain];
   [window addSubview: [twc view]];

    [window makeKeyAndVisible];
}


- (void)dealloc {
    [window release];
    [super dealloc];
}


@end

答案 2 :(得分:0)

这有点复杂,但我的解决方案非常可靠地运行如下: (假设您有一个数组作为数组,每个数组代表一个部分,并包含实际上在表中的行的项目。)

当我们从服务器加载一些数据(例如JSON)时,这个例子符合这种情况,并且结果的部分和/或行的数量可能非常不同。

void函数,你可以省略它

-(void)addToPropertiesTable {

    //fullTableData is above mentioned two dimensional array 
    int sectionsCount = _fullTableData.count;
    int count = 0;
    NSMutableArray *insertIndexPaths = [NSMutableArray array];
    NSMutableArray *deleteIndexPaths = [NSMutableArray array];

    for(int j = 0; j < sectionsCount; j++) {
        NSMutableArray *currentAdverts = [[NSMutableArray alloc] init];
        [currentAdverts addObjectsFromArray:[_fullTableData objectAtIndex:j]];
        count = [currentAdverts count];

        int currentRowsInSection = [self.propertiesTable numberOfRowsInSection:j];

        if(currentRowsInSection > 0) {
            //if any data in current tableView, lets get rid of them first
            for (int i = [self.propertiesTable numberOfRowsInSection:j] - 1; i >=0 ; i--)
            {
                [deleteIndexPaths addObject:[NSIndexPath indexPathForRow:i inSection:j]];
            }
        }
        for (NSUInteger item = 0; item < count; item++) {            
            [insertIndexPaths addObject:[NSIndexPath indexPathForRow:item inSection:j]];
        }
    }


    [self.propertiesTable beginUpdates];

    //we delete old rows - whether we need them or not
    [self.propertiesTable deleteRowsAtIndexPaths:deleteIndexPaths
                                withRowAnimation:UITableViewRowAnimationFade];
    if([self.propertiesTable numberOfSections]) {

        //if any sections, we remove them
        NSIndexSet *nsIndexSetToDelete = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0,[self.propertiesTable numberOfSections])];
        [self.propertiesTable deleteSections:nsIndexSetToDelete withRowAnimation:UITableViewRowAnimationAutomatic];
    }


    //here we have to set new sections, whether they have changed or not
    NSIndexSet *nsIndexSetToInsert = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0,sectionsCount)];
    [self.propertiesTable insertSections:nsIndexSetToInsert withRowAnimation:UITableViewRowAnimationAutomatic];

    //finally we insert rows 
    [self.propertiesTable insertRowsAtIndexPaths:insertIndexPaths
                                withRowAnimation:UITableViewRowAnimationFade];
    [self.propertiesTable endUpdates];

    //now we see the change in UI
    [self.propertiesTable reloadData];
}