4

我正在尝试将 UITableView 放入 UIView。UIView 也会包含一些其他的东西,所以我想定义 UIView 的一部分供 UITableView 使用。在这个网站和其他网站上阅读时,我正在使用“UIViewController”并代表“”。

我的问题是:

  • 为什么我没有看到任何带有以下代码的 UITable?

  • 为什么我在 InformatieSectieViewController.h 中更改时会看到 UITable

    @interface InformatieSectieViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
    

    @interface InformatieSectieViewController : UIViewTableController <UITableViewDataSource, UITableViewDelegate>
    

    (UIViewController 到 UIViewController)?(然后这个 UITable 占据了整个 UIView)。

  • 如何将 UITableView 正确放入 UIView。

  • 什么也让我感到惊讶;当我从@interface InformatieSectieViewController : UIViewController < UITableViewDataSource, UITableViewDelegate> 中删除 < UITableViewDataSource, UITableViewDelegate> 部分时,我希望在行中出现警告(在 InformatieSectieViewController.m 中):

    tabView.delegate = self;
    tabView.dataSource = self;
    

    但我没有收到这个警告。

这是我正在使用的代码:

信息Sectie.h

#import <UIKit/UIKit.h>
@interface InformatieSectie : NSObject
@property (strong, nonatomic) NSString *header;
-(UIView*)createInformatieSectie;
@end

信息部门.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 的第二个类:

信息SectieViewController.h

#import <Foundation/Foundation.h>
@interface InformatieSectieViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, retain) UITableView *tabView;
@end

信息SectieViewController.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
4

2 回答 2

6

几点观察:

  1. 您问:

    当我<UITableViewDataSource, UITableViewDelegate>

        @interface InformatieSectieViewController : UIViewController < UITableViewDataSource, UITableViewDelegate>
    

    我希望在线上出现警告(在 InformatieSectieViewController.m 中):

        tabView.delegate = self;
        tabView.dataSource = self;
    

    但我没有收到这个警告。

    是的,这很好奇。如果你使用UIViewController,你真的应该看到那些警告。如果您有其他警告,有时您将看不到一些后续警告。或者有时如果您编辑标题,但不保存和/或构建,您可能不会看到警告,直到您这样做。或者尝试从“Build”菜单中选择“Clean”,然后重新构建,看看是否收到警告。

    无论如何,即使您没有看到这些警告,您仍然应该定义它以符合这两个协议,因为这将使您在 Xcode 中的代码完成更容易。

    但是,如果您使用 aUITableViewController作为基类,则不需要将其定义为符合这两个协议,因为它已经符合UITableViewDataSourceand UITableViewDelegate

  2. 如何将tableview添加为子视图

    并回答更广泛的问题,即如何将表格视图添加到上面有其他内容的视图中,而不是在以下内容中执行以下操作loadView

    self.view = tabview;
    

    相反,您应该在 中执行以下操作loadView

    self.view = [[UIView alloc] init];
    [self.view addSubview:tabview];
    

    或者,如果您不是在 中以编程方式构建视图loadView,而是使用 NIB 或情节提要,则可以在 中执行以下操作viewDidLoad

    [self.view addSubview:tabview];
    

    无论如何,通过确保您有另一个 a main UIView,并且您UITableView是一个子视图,您可以因此向该主视图添加其他控件。

  3. 视图和视图控制器层次结构

    进一步查看您的代码示例,我看到您正在创建控制器,获取其视图,将该视图添加为子视图,然后让控制器超出范围。这是一个非常糟糕的做法。如果是 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];
    }
    

    这三种技术中的任何一种都将确保您的视图控制器层次结构与您的视图层次结构同步。我知道这看起来有点矫枉过正,但如果你不以这三种方式之一来处理它,你以后会遇到问题。

我知道这里有很多,但我希望它有所帮助。如果造成混淆,我深表歉意。

于 2013-05-01T13:35:27.247 回答
0

你应该做[self.view addSubview:self.tabView]而不是 self.view = self.tabView

于 2013-05-01T13:35:52.453 回答