- 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/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!