reloadData将Delegate和dataSource更改为UITableView

时间:2014-10-20 16:56:30

标签: ios objective-c iphone uitableview

当我尝试从Web服务数据填充 UITableView 时出现问题。

我有这种方法。

#pragma UITableView methods
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSLog(@"count... %i-%@-%@",[self.tweets count], _myTable.delegate, _myTable.dataSource);
return [self.tweets count];
 }

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 95;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"Cell...");
static NSString *cellIdentifier = @"Cell";

TweetCell *cell = (TweetCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
    cell = [[TweetCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
 }


if ([self.tweets count] != 0) {
    SBTVTweets *current_tweet = [self.tweets objectAtIndex:indexPath.row];
    cell.username.text = current_tweet.name;
}

return cell;
}


//Clicked Row in the Table View action
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"Clicked");
}

在这种方法中,我调用了方法 reloadData

-(Table *)initWithTweets:(NSArray *)tweets{
      self = [self init];
      if (self) {
        self.tweets = [tweets copy];
     }
    [self.myTable reloadData];
    return self;
}

这是我表的 IBOutlet

@property (weak, nonatomic) IBOutlet UITableView *myTable;

在我的档案 .h 我有这个。

@interface Table : UIView <UITableViewDataSource, UITableViewDelegate>

执行时,日志显示:

 2014-10-20 12:52:37.026 NuncheeTestsApp[15717:110695] count... 0-<Table: 0x7c198e50; frame = (0 0; 524 265); autoresize = W+H; layer = <CALayer: 0x7c19a200>>-<Table: 0x7c198e50; frame = (0 0; 524 265); autoresize = W+H; layer = <CALayer: 0x7c19a200>>
 2014-10-20 12:52:37.033 NuncheeTestsApp[15717:110695] count... 0-<Table: 0x7c198e50; frame = (0 0; 524 265); autoresize = W+H; layer = <CALayer: 0x7c19a200>>-<Table: 0x7c198e50; frame = (0 0; 524 265); autoresize = W+H; layer = <CALayer: 0x7c19a200>>
 2014-10-20 12:52:39.518 NuncheeTestsApp[15717:110695] count... 20-<Table: 0x7c1a7ba0; frame = (0 0; 524 265); autoresize = W+H; layer = <CALayer: 0x7c1949c0>>-<Table: 0x7c1a7ba0; frame = (0 0; 524 265); autoresize = W+H; layer = <CALayer: 0x7c1949c0>

第三次填充数组,但委托 dataSource 已更改, UITableVIew 未显示任何内容。我不知道......

任何想法。

感谢。

1 个答案:

答案 0 :(得分:0)

首先,我要说不要从初始化程序中调用reloadData。你最好在viewDidLoad中调用它:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.myTable reloadData];
}

其次,如果您使用UITableViewController或仅UIViewController,我就无法发布您发布的内容。如果是后者,您需要自己设置委托数据源

- (void)viewDidLoad {
    [super viewDidLoad];

    self.myTable.delegate = self;
    self.myTable.dataSource = self;

    [self.myTable reloadData];
}

此外,由于几个版本之前您可以使用dequeueReusableCellWithIdentifier:forIndexPath:来处理 nil 案例:

static NSString *cellIdentifier = @"Cell";

- (void)viewDidLoad {
    [super viewDidLoad];

    self.myTable.delegate = self;
    self.myTable.dataSource = self;

    [self.myTable registerClass:[TweetCell class] forCellReuseIdentifier: cellIdentifier];

    [self.myTable reloadData];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    TweetCell *cell = (TweetCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    if ([self.tweets count] != 0) {
        SBTVTweets *current_tweet = [self.tweets objectAtIndex:indexPath.row];
        cell.username.text = current_tweet.name;
    }

    return cell;
}

希望有所帮助。


修改

我刚刚意识到你为所有这些代码继承了UIView。正如我上面提到的,可能最容易将UITableViewController子类化,这已经符合UITableViewDataSourceUITableViewDelegate协议。它还会为您添加UITableView