storyboardを使用して UITableViewController を作成し、デバイスを検出するたびにテーブルビューをリロードしたい (bonjour プロトコルの場合)。ただし、リロード データ メソッドは numberofRows のみを呼び出し、CellForRowatIndexPath を呼び出しません。だから私は何も変わっていません。チェックした mutablearray は常に正しく動作しています。NewObjects が追加されます。しかし、テーブルビューは配列で変わりません。ですから、ここで sth を間違って設定したのではないかと思っています。
追加した NSLog から、最初に初期化された配列でテーブルビューをロードできることがわかりました
self.serviceArray = [[NSMutableArray alloc]initWithObjects:@"test", nil];
しかしその方法では
- (void)addService:(NSNetService *)....
リロードするたびに、新しいオブジェクトを mutableArray に追加できますが、テーブルビューは配列で変更されません。(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 です。またはスペースなしで初期化されたセル。メソッドのデリゲートを確認する方法はありますか?
また、IBOutlet にリンクされた .h ファイルに tableview プロパティを作成してから、.m ファイルに合成しようとしました。しかし、まだ機能しません。誰でも私を助けることができますか?
多くのチュートリアルはウィンドウベースのアプリケーションに基づいているため、誰かがストーリーボードと reloadData を使用したチュートリアルを提供してくれませんか? アウトレットが間違っているかどうかを確認できました。
前もって感謝します。
UPDATE1 AddService メソッドは appDelegate で呼び出されます
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が呼び出せない?