我使用 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?
答案 0 :(得分:0)
请检查此条款可能会对您有所帮助:
self.tableView
是XIB中TableView中的对象绑定。
.h文件中包含<UITableViewDelegate,UITableViewDataSource>
个代表?
正确设置getter setter您的对象“self.tableView
”
代表集?
一)[self.tableView setDelegate: self];
B)[self.tableView setDataSource:self];
答案 1 :(得分:0)
我认为不需要在视图中显示以下行
_serviceArray = nil; self.serviceArray = nil;
并确保调用addService函数: