我如何将UITableView放入UIView中
我想把一个UITableView放入UIView中。 UIView也包含一些其他的东西,所以我想要定义UITableView使用的UIView的一部分。 读这个和其他网站,我使用“UIViewController”和委托“”。
我的问题是:
为什么我在下面的代码中看不到任何UITable?
为什么我在InformatieSectieViewController.h中更改时看到UITable
@interface InformatieSectieViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
至
@interface InformatieSectieViewController : UIViewTableController <UITableViewDataSource, UITableViewDelegate>
(UIViewController到UITableViewController)? (这个UITable然后占用整个UIView)。
如何正确地将UITableView放入UIView中。
什么也让我感到惊讶; 当我从@interface InformatieSectieViewController:UIViewController <UITableViewDataSource,UITableViewDelegate>中移除<UITableViewDataSource,UITableViewDelegate>部分时,我会在行上发出警告(在InformatieSectieViewController.m中):
tabView.delegate = self;
tabView.dataSource = self;
但我没有得到这个警告。
这里是我使用的代码:
InformatieSectie.h
#import <UIKit/UIKit.h>
@interface InformatieSectie : NSObject
@property (strong, nonatomic) NSString *header;
-(UIView*)createInformatieSectie;
@end
InformatieSectie.m
#import "InformatieSectie.h"
#import "InformatieSectieViewController.h"
#import <QuartzCore/QuartzCore.h>
@implementation InformatieSectie
@synthesize header;
@synthesize footer;
-(UIView*)createInformatieSectie{
UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0, 200, breedte, hoogte)];
//(add headerlabel at pos)
[view addSubview:headerLabel];
InformatieSectieViewController *svc = [[InformatieSectieViewController alloc] init];
[view addSubview:svc.view];
return view;
}
@end
这是我定义UITableView的第二个类:
InformatieSectieViewController.h
#import <Foundation/Foundation.h>
@interface InformatieSectieViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, retain) UITableView *tabView;
@end
InformatieSectieViewController.m
#import "InformatieSectieViewController.h"
#import <QuartzCore/QuartzCore.h>
@implementation InformatieSectieViewController
@synthesize tabView;
-(void)loadView {
tabView = [[UITableView alloc] initWithFrame:CGRectMake(100, 100, 20, 20)];
tabView.delegate = self;
tabView.dataSource = self;
tabView.layer.borderWidth = 10.0;
tabView.layer.borderColor = [UIColor yellowColor].CGColor;
self.view = tabView;
self.view.layer.backgroundColor = [UIColor magentaColor].CGColor;
[super loadView];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// (return some cell)
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// (Nothing yet)
}
@end
几点意见:
你问:
当我从中移除<UITableViewDataSource, UITableViewDelegate>
部分
@interface InformatieSectieViewController : UIViewController < UITableViewDataSource, UITableViewDelegate>
我期望在行上有一个警告(在InformatieSectieViewController.m中):
tabView.delegate = self;
tabView.dataSource = self;
但我没有得到这个警告。
是的,这很好奇。 如果你使用UIViewController
,你真的应该看到这些警告。 如果您有其他警告,有时您不会看到一些后续警告。 或者有时候,如果你编辑标题,不要保存和/或构建,你可能会看不到警告。 或者尝试从“Build”菜单中选择“Clean”,然后重新构建,看看是否会收到警告。
无论如何,即使您没有看到这些警告,您仍然应该将其定义为符合这两个协议,因为这会使您的代码在Xcode中更容易完成。
但是,如果使用UITableViewController
作为基类,则无需将其定义为符合这两种协议,因为它已符合UITableViewDataSource
和UITableViewDelegate
。
如何添加tableview作为子视图
而在回答更广泛的问题时,如何将表视图添加到其他视图上,而不是在loadView
执行以下操作:
self.view = tabview;
相反,您应该在loadView
执行以下操作:
self.view = [[UIView alloc] init];
[self.view addSubview:tabview];
或者,如果您不是在loadView
以编程方式构建视图,而是使用NIB或故事板,则可以在viewDidLoad
执行以下操作:
[self.view addSubview:tabview];
无论如何,通过确保你有另一个主UIView
,并且你的UITableView
是一个子视图,你可以将其他控件添加到该主视图。
查看和查看控制器层次结构
仔细查看你的代码示例,我发现你正在创建控制器,抓取它的视图,将该视图添加为子视图,然后让控制器超出范围。 这是一个非常糟糕的做法。 如果ARC,你会得到例外。 如果是非ARC,如果你拒绝这个视图,你会泄漏(不是问题,但如果这是你的顶级视图)。
更糟的是,如果你这样做,你的视图控制器将不会收到某些事件(特别是旋转事件,但可能还有其他事件)。 请参阅WWDC 2011 - 实现UIViewController Containment以讨论保持视图和视图控制器层次结构同步的重要性。
如果这是您的顶级控制器,则应将此控制器设置为rootViewController
,例如在您的应用程序委托中:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
// create your controller any way you want
self.viewController = [[InformatieSectieViewController alloc] init];
// if not using ARC, it should be
//
// self.viewController = [[[InformatieSectieViewController alloc] init] autorelease];
// by defining this as your root view controller, you'll be assured that the controller
// is now part of the controller hierarchy
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
如果这个视图控制器不是最高级别的控制器,你可以在呈现控制器中创建它,并且从呈现视图控制器中执行一个模式或推入segue,例如:
- (void)transitionToNextViewController
{
UIViewController *controller = [[InformatieSectieViewController alloc] init];
// again, if not using ARC, that line should be:
//
// UIViewController *controller = [[[InformatieSectieViewController alloc] init] autorelease];
[self presentViewController:controller animated:YES completion:nil];
// or
// [self.navigationController pushViewController:controller animated:YES];
}
或者,在您使用自定义容器视图控制器的情况下,您可以执行如下操作:
- (void)addChild
{
UIViewController *controller = [[InformatieSectieViewController alloc] init];
// again, if not using ARC, that line should be:
//
// UIViewController *controller = [[[InformatieSectieViewController alloc] init] autorelease];
[self addChildViewController:controller];
controller.view.frame = CGRectMake(x, y, width, height);
[self.view addSubview:controller.view];
[controller didMoveToParentViewController:self];
}
这三种技术中的任何一种都将确保您的视图控制器层次结构将与您的视图层次结构同步。 我知道这看起来有点过分,但如果你不以这三种方式之一处理它,你会在后面遇到问题。
我知道这里有很多,但我希望它有帮助。 我很抱歉,如果它很混乱。
你应该做[self.view addSubview:self.tabView]
而不是self.view = self.tabView