Reloaddata不会调用cellForRowatIndexPath

时间:2013-05-07 11:17:29

标签: ios xcode uitableview

我使用 storyboard 创建一个UITableViewController,并希望每次检测到设备时都重新加载tableview(用于bonjour协议)。   但是,重载数据方法只调用numberofRows,而不调用CellForRowatIndexPath。所以我没有任何改变。我检查的mutablearray总是正确的。添加了NewObjects。但是tableview不会随阵列而改变。所以我想知道我是否在这里设置错误。

从我添加的NSLog中,我发现,我可以在开头加载tableview 初始化数组

 self.serviceArray = [[NSMutableArray alloc]initWithObjects:@"test", nil];

但是方法

 - (void)addService:(NSNetService *)....

每次重新加载时,都可以将新对象添加到mutableArray中,但tableview不会随阵列一起变化。 (它调用numberOfRows,我检查返回的数组大小不是0,但是它不调用cellOfRowAtIndex)

这是我的代码

.h文件

   #import <UIKit/UIKit.h>
   #import "Server.h"
   @interface BrowserViewController : UITableViewController <ServerDelegate>
    {
       Server *_server;
       NSMutableArray *_serviceArray;
    }

   @property (retain,nonatomic) NSMutableArray *serviceArray;
   @property (nonatomic,retain) Server *server;


   - (void)addService:(NSNetService *)service moreComing:(BOOL)more;
   @end

.m文件

   #import "BrowserViewController.h"
   @implementation BrowserViewController
   @synthesize serviceArray = _serviceArray;
   @synthesize server = _server;

   - (void) dealloc
   {
       [self.serviceArray release];
       [self.tableView release];
       [super dealloc];

    }



   - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:YES];
        self.title = @"Service Browser";


        _serviceArray = nil;
        self.serviceArray = nil;

        [self.tableView setDelegate: self];
        [self.tableView setDataSource:self];  
        //actually I set this in the storyboard already

        [self.tableView reloadData];

    }

    - (void)viewWillDisappear:(BOOL)animated 
    {
        [super viewWillDisappear:animated];
        _serviceArray = nil;
        NSLog(@"viewwilldisappear");
    }

    - (NSMutableArray *)serviceArray {

      if(nil == _serviceArray) {
         self.serviceArray = [[NSMutableArray alloc]initWithObjects:@"test", nil];
    }
      else
    {
        NSLog(@"update array");
    }

    return _serviceArray;

    }

   - (void)didReceiveMemoryWarning
   {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
   }


   - (void)addService:(NSNetService *)service moreComing:(BOOL)more{

    [self.serviceArray addObject:service];

    if (!more) {
        [self.tableView reloadData];
         }
    }

   #pragma mark - Table view data source



  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  {
      return 1;
   }

  - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return @"Connection Choices";
    }


  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [self.serviceArray count];

     }

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

       static NSString *CellIdentifier = @"Cell";
       UITableViewCell *Cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

       if (Cell == nil) {
            Cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]autorelease];
        }

       NSString *text = [self.serviceArray objectAtIndex:indexPath.row];

       Cell.textLabel.text = text;

       return Cell;
       }

       @end

我检查了一些解决方案,它是委托设置问题,或者数组是null。或没有空格初始化的单元格。有没有办法检查某些方法的委托是什么?

我还尝试在.h文件中创建一个tableview属性,链接IBOutlet,然后在.m中合成它。但仍然行不通。谁能帮助我?

由于很多教程都基于基于窗口的应用程序,有人可能会使用故事板和使用reloadData为我提供一些教程吗?我可以检查出口是否错误。

提前致谢。

UPDATE1 在appDelegate

中调用AddService方法

appDelegate.h

 #import <UIKit/UIKit.h>
 #import "Server.h"

 @class BrowserViewController;

 @interface iphoneNetworkAppDelegate : NSObject <UIApplicationDelegate,UITableViewDataSource, UITableViewDelegate, ServerDelegate>
{
    Server *_server;
    UIWindow *window;
    IBOutlet BrowserViewController *BrowserVC;

}
@property (strong, nonatomic) UIWindow *window;


@end

appDelegate.m

#import "iphoneNetworkAppDelegate.h"
#import "BrowserViewController.h"

@implementation iphoneNetworkAppDelegate
@synthesize window;


- (void)dealloc
{
[window release];


[_server release];
_server = nil;
[BrowserVC release];
BrowserVC = nil;
[super dealloc];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

NSString *type = @"TestingProtocol";
_server = [[Server alloc] initWithProtocol:type];
_server.delegate = self;
NSError *error = nil;
if(![_server start:&error]) {
    NSLog(@"error = %@", error);
}

BrowserVC = [BrowserViewController alloc];
if (BrowserVC == nil) {
    NSLog(@"need to init");
}
BrowserVC.server = _server;


return YES;
}



#pragma mark Server Delegate Methods

- (void)serverRemoteConnectionComplete:(Server *)server {
NSLog(@"Server Started");

BrowserVC.server = server;

}

- (void)serverStopped:(Server *)server {
NSLog(@"Server stopped");
}

- (void)server:(Server *)server didNotStart:(NSDictionary *)errorDict {
NSLog(@"Server did not start %@", errorDict);
}

- (void)server:(Server *)server didAcceptData:(NSData *)data {
NSLog(@"Server did accept data %@", data);

}

- (void)server:(Server *)server lostConnection:(NSDictionary *)errorDict {
NSLog(@"Server lost connection %@", errorDict);

}

- (void)serviceAdded:(NSNetService *)service moreComing:(BOOL)more {

NSLog(@"service added in delegate");

[BrowserVC addService:service moreComing:more];
}


#pragma mark -

- (void)applicationWillTerminate:(UIApplication *)application {
[_server stop];
[_server stopBrowser];
}

如果appDelegate设置是这样的,则无法调用reloadData?

2 个答案:

答案 0 :(得分:0)

请检查此条款可能会对您有所帮助:

  1. self.tableView是XIB中TableView中的对象绑定。

  2. .h文件中包含<UITableViewDelegate,UITableViewDataSource>个代表?

  3. 正确设置getter setter您的对象“self.tableView

  4. 代表集?

    一)[self.tableView setDelegate: self];

    B)[self.tableView setDataSource:self];

答案 1 :(得分:0)

  1. 我认为不需要在视图中显示以下行

    _serviceArray = nil; self.serviceArray = nil;

  2. 并确保调用addService函数:

相关问题