来自单独类的UITableView

时间:2015-06-16 19:46:52

标签: ios objective-c xcode uitableview

案例如下:我想从单独的类创建UITableView。

目前我有以下内容:

//  Menu.h

@interface Menu : UITableViewController <UITableViewDelegate, UIAlertViewDelegate> {        
    UITableView *tableView;
}

@property (nonatomic,retain) NSMutableArray *navigationItems;    
- (void)initMenu:(UIView *)view;    
@end;

然后

//  Menu.m
#import <Foundation/Foundation.h>
#import "Menu.h"

@implementation Menu

- (void) initMenu:(UIView *)view {

    self.navigationItems = [[NSMutableArray alloc] initWithObjects:@"One",@"Two",@"Three",@"Four",@"Five",@"Six",@"Seven",@"Eight",@"Nine",@"Ten",nil];

    UIView *mainmenu=[[UIView alloc]initWithFrame:CGRectMake(0, 50, 320, 420)];
    [mainmenu setBackgroundColor:[UIColor yellowColor]];
    [view addSubview:mainmenu];

    UITableView *menutableView = [[UITableView alloc] initWithFrame:view.bounds style:UITableViewStylePlain];
    menutableView.backgroundColor = [UIColor whiteColor];
    menutableView.delegate = self;
    menutableView.dataSource = self;

    [mainmenu addSubview:menutableView];

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

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

- (UITableViewCell *)tableView:(UITableView *)tableViewi cellForRowAtIndexPath:(NSIndexPath *)indexPath {        
    static NSString *CellIdentifier = @"Cell";        
    UITableViewCell *cell = [tableViewi dequeueReusableCellWithIdentifier:CellIdentifier];        
    if (cell == nil) {            
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];   
    }
    cell.textLabel.text = [self.navigationItems objectAtIndex:indexPath.row];
    return cell;

}
@end

在不同的.m文件中我调用方法:

...
#import "Menu.h"
...

- (void)viewDidLoad
{
    [super viewDidLoad];
    ...
    Menu *menu = [[Menu alloc] init];
    [menu initMenu: self.view];

}

运行此操作会使应用程序崩溃,Xcode不会提供任何详细报告。但是,如果我将Menu.m结合到我正在调用“initMenu”的.m文件中,它就不会崩溃。

此外,如果我发表评论menutableView.dataSource = self;,它将与我们的崩溃一起运行(当然,表中没有行......)。

1 个答案:

答案 0 :(得分:0)

将视图传递到init方法,然后在所述init方法中创建/添加子视图是一种奇怪的设计模式。将Menu类更改为viewcontroller,然后将UIView和UITableView声明移动到viewDidLoad方法。崩溃很可能发生,因为tableview试图在父视图加载完成之前显示数据。