- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试将 UITableView 放入 UIView。 UIView 还将包含一些其他内容,因此我想定义 UIView 的一部分以供 UITableView 使用。在这个网站和其他网站上阅读时,我正在使用“UIViewController”和委托(delegate)“”。
我的问题是:
为什么我看不到带有以下代码的任何 UITable?
为什么在 InformatieSectieViewController.h 中更改时会看到 UITable
@interface InformatieSectieViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
到
@interface InformatieSectieViewController : UIViewTableController <UITableViewDataSource, UITableViewDelegate>
(UIViewController 到 UITableViewController)? (然后这个 UITable 占据了整个 UIView)。
如何将 UITableView 正确地放入 UIView。
同样让我吃惊的是;当我从@interface InformatieSectieViewController 中删除 < UITableViewDataSource, UITableViewDelegate> 部分时: UIViewController < 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
最佳答案
一些观察:
你问:
When I remove the
<UITableViewDataSource, UITableViewDelegate>
part from@interface InformatieSectieViewController : UIViewController < UITableViewDataSource, UITableViewDelegate>
I would expect a warning on the lines (in InformatieSectieViewController.m):
tabView.delegate = self;
tabView.dataSource = self;But I do not get this warning.
是的,这很奇怪。如果你使用 UIViewController
,你真的应该看到那些警告。如果您有其他警告,有时您将看不到一些后续警告。或者有时如果您编辑标题,不保存和/或构建,您可能不会看到警告,直到您这样做。或者尝试从“Build”菜单中选择“Clean”,然后重新构建,看看是否收到警告。
无论如何,即使您没有看到这些警告,您仍然应该定义它以符合这两个协议(protocol),因为这将使您在 Xcode 中完成代码更容易。
如果您使用 UITableViewController
但是,作为基类,您不需要将其定义为符合这两个协议(protocol),因为它已经符合 UITableViewDataSource
。和 UITableViewDelegate
.
如何将表格 View 添加为 subview
并回答更广泛的问题,即如何将 TableView 添加到包含其他内容的 View 中,而不是在 loadView
中执行以下操作:
self.view = tabview;
相反,您应该在 loadView
中执行以下操作:
self.view = [[UIView alloc] init];
[self.view addSubview:tabview];
或者,如果您没有在 loadView
中以编程方式构建 View ,而是使用 NIB 或 Storyboard,然后您可以在 viewDidLoad
中执行以下操作:
[self.view addSubview:tabview];
无论如何,通过确保你有另一个主要的 UIView
,还有你的 UITableView
是一个 subview ,因此您可以向该主视图添加其他控件。
查看和查看 Controller 层次结构
进一步查看您的代码示例,我发现您正在创建 Controller 、获取其 View 、将该 View 添加为 subview ,然后让 Controller 超出范围。这是一个非常糟糕的做法。如果是 ARC,您将获得异常。如果是非 ARC,如果您关闭此 View ,就会泄漏(不过,如果这是您的顶级 View ,这不是问题)。
更糟糕的是,如果您这样做,您的 View Controller 将不会收到某些事件(特别是旋转事件,但也可能是其他事件)。参见 WWDC 2011 - Implementing UIViewController Containment用于讨论保持 View 和 View Controller 层次结构同步的重要性。
如果这是您的顶级 Controller ,您应该将此 Controller 设置为 rootViewController
,例如在你的应用委托(delegate)中:
- (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;
}
如果此 View Controller 不是顶级 Controller ,您将在呈现 Controller 中创建它,并从呈现 View Controller 执行模态或推送 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];
}
或者,万一您使用的是自定义容器 View Controller ,您会执行如下操作:
- (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];
}
这三种技术中的任何一种都可以确保您的 View Controller 层次结构与您的 View 层次结构同步。我知道这看起来有点矫枉过正,但如果您不以这三种方式之一处理它,您以后会遇到问题。
我知道这里有很多,但我希望它有所帮助。如果造成混淆,我深表歉意。
关于ios - 如何将 UITableView 放入 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16319058/
我坚持我的项目(用 Swift 编写) 我有一个 UITableView,它有一个字符串,它提供了表格中的十个类别。我想做的是选择这些类别中的一个来触摸它,然后打开一个包含其他类别的 secondTa
好的,这从 iOS 7 Beta 6 开始就被打破了。 在启动时,我将表格 View 的背景更改为图像(如果我将其设置为颜色,它会做同样的事情)并且表格单元格是白色的...... 当我选择一个单元格时
我有一个包含不同部分的 UITableView,每个单元格上都有一个图像。因为图像是为每个单元格单独下载的,所以我正在寻找一种延迟加载解决方案。 在 iOS Developer Library 上,它
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
可以在UIRefreshControl的底部添加UITableView吗? 我会用它来加载更多数据。 拜托,有什么建议吗? 最佳答案 我相信不会有任何简单的解决方案来解决这个问题。可能有人可以编写一个
我有一个 UITableView 和一个使用 Swift 的自定义 UITableViewCell。当我设置 self.MyTable.editing = true 时,我看到该行上有删除图标,并且似
我为 iPhone 创建了一个下载器应用程序。我有用于显示主动/被动下载的表格 View 。在 tableview 的自定义单元格中有进度条,它显示 %XX 下载状态。现在我正在使用 NSTimer
我正在编写 UITableView 的自定义子类。我需要这个对象本身成为它自己的数据源和委托(delegate),然后这个子类将有它自己的数据源和委托(delegate)。这主要是为了让我可以拦截对数
我有一个问题已经困扰我几天了。 我有一个名为 countries 的数组。该数组包含一个自定义对象,其中包含国家、城市、IP、状态等数据。 我需要在按属性“国家/地区”划分的表格 View 中显示这些
我有一个 UITableViewController,目前显示 4 个将始终显示的单元格,并且想将它们组合在一起,但我不知道如何操作。当在 UIViewController 或类似的东西上插入标准 U
我以编程方式创建了一个 UITableView,现在我想向它添加一个固定的标题。 正如我下面的代码一样,标题也随着我的 tableview 滚动。 UILabel *label = [[[UI
我正在创建一个 UITableViewController(在 UINavigationController 的根部)并在另一个 View Controller 之上以模态方式呈现它。我让它在一定程度
我有问题。我有动态 TableView 。所以我需要在我的 textLabel 中更改文本大小。我试过: 一个: cell.textLabel.font = [UIFont systemFontOfS
iOS 8 中的新功能是 separatorEffect属性,您可以为其分配 UIVisualEffect。有没有人知道这是做什么用的?我试过了,我不认为它有任何,呃,视觉效果。 最佳答案 我想知道完
今天早上,我刚刚安装了包含iOS 6的新Xcode。 我有一个加载了包含章节和行的plist文件的表格 View 。各章定义各节。 用户选择章节和行,并将tableview自动滚动到正确的位置(在vi
我在iOS 7上启动VoiceOver时遇到了一些麻烦。我确实在UITableViewHeaderFooterView中注册了viewDidLoad子类的实例,但是当我用-[tableView deq
我在 UITableView 中添加了一些数据,我想更改单元格中显示的文本的颜色。 是否有委托(delegate)方法可以执行此操作,或者有其他方式吗? 最佳答案 无需标签 您只需要编码: cell.
是否可以在滚动 UITableView 时动态更改单元格的高度? 当用户将其向下拖动到顶部时,滚动位置到达某个点时,我需要更改多个单元格的高度。我可以通过发出 reloadData 成功地做到这一点,
我正在使用 iOS 5,并在表格中动态生成单元格(2 个部分,每个部分 3 行)。每个部分都有一个标题,该标题也是使用 titleForHeaderInSection 调用动态生成的。 我还设置了一个
我正在寻找 UITableView 的回调函数当我使用 Apple Remote 导航并按向上或向下键选择行时(而不是按 Enter 键时),当该行聚焦时。 在 iOS 上,我们有 didSelect
我是一名优秀的程序员,十分优秀!