Поместить UITableView и источник данных / делегат в отдельный класс не работает (XCode 4.2) - PullRequest
2 голосов
/ 09 октября 2011

Я попытался поместить делегата и источник данных моего табличного представления в отдельный класс. Моя проблема в том, что он всегда вылетает без ошибок. Вот почему я не могу понять, что я делаю неправильно. Может быть, кто-то может сказать мне. Может быть, это также важно, что я использую ARC.

Так вот мой простой код:

//ViewController.h
@interface ViewController : UIViewController {
    UITableView *myTableView;
}

@property (strong, nonatomic) IBOutlet UITableView *myTableView;

@end

//ViewController.m
#import "ViewController.h"
#import "MyTableViewDatasourceDelegate.h"

@implementation ViewController
@synthesize myTableView;

- (void)viewDidLoad
{
    [super viewDidLoad];
    MyTableViewDatasourceDelegate *test = [[MyTableViewDatasourceDelegate alloc] init];

    self.myTableView.delegate = test;
    self.myTableView.dataSource = test;
}

@end

//MyTableViewDelegateDatasourceDelegate.h
@interface MyTableViewDatasourceDelegate : NSObject <UITableViewDataSource, UITableViewDelegate>

@end

//MyTableViewDatasourceDelegate.m
@implementation MyTableViewDatasourceDelegate

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

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

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

    cell.textLabel.text = @"Test";
    return cell;
}

@end

1 Ответ

6 голосов
/ 09 октября 2011

Кажется, вы не ссылаетесь на test где-либо еще, поэтому он автоматически освобождается в конце метода viewDidLoad.Убедитесь, что вы реализуете test как переменную экземпляра, так что по крайней мере на что-то есть ссылка на нее.

Необязательно, чтобы объект был иваром для его сохранения.Взгляните на delegate определение свойства:

@property(nonatomic,assign)   id <UITableViewDelegate>   delegate;

Здесь assign имеет решающее значение, это означает, что это слабая ссылка, и UITableView не будет сохранять этот объект.Обратите внимание, что если бы он сказал (nonatomic, retain), ваш код будет работать, но это было дизайнерское решение Apple, чтобы реализовать его таким образом, чтобы избежать сохранения циклов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...