我知道之前已经问过这个问题,但答案是矛盾的,我很困惑,所以请不要激怒我.
我希望UIView在我的应用程序中有一个可重用的子类.我想用nib文件描述接口.
现在让我们说它是一个加载指示器视图,其中包含一个活动指示器.我希望在某个事件上实例化此视图并激活到视图控制器的视图.我可以用编程方式描述视图的界面没有问题,以编程方式创建元素并在init方法中设置它们的框架等.
我怎么能用笔尖做到这一点?维护界面构建器中给出的大小而不必设置框架.
我已经设法这样做,但我确定它是错的(它只是一个带有选择器的视图):
- (id)initWithDataSource:(NSDictionary *)dataSource {
self = [super init];
if (self){
self = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", [self class]] owner:self options:nil] objectAtIndex:0];
self.pickerViewData = dataSource;
[self configurePickerView];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
但是我覆盖了自己,当我实例化它时:
FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
selectView.delegate = self;
selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
Run Code Online (Sandbox Code Playgroud)
我必须手动设置框架而不是从IB中拾取它.
编辑:我想在视图控制器中创建此自定义视图,并有权控制视图的元素.我不想要一个新的视图控制器.
谢谢
编辑:我不知道这是不是最好的做法,我确定不是,但这就是我做的方式:
FSASelectView *selectView = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@",[FSASelectView class]] owner:self options:nil] objectAtIndex:0];
selectView.delegate = self;
[selectView configurePickerViewWithData:ds];
selectView.frame = CGRectMake(0, …Run Code Online (Sandbox Code Playgroud) 在复杂的屏幕(视图控制器)中,我曾经将整个事物分成小块(我称之为小部件).这些小部件基本上由一个MyWidget.h和一个MyWidget.m文件以及一个MyWidget.xib文件组成,其中根元素是a UIView,而MyWidget类是UIView的文件所有者.在这个小部件的init中,我做了一个loadNibNamed.
在我的View Controller中,然后执行a [[MyWidget alloc] init],我将其作为子视图添加到View的Controller主视图中.到目前为止,这完美地运作.
我现在想知道,如何对故事板做同样的事情,因为我无法真正开始拖入UIView某个地方,我总是要从一个开始UIViewController,我不想这样做.
如果使用Storyboard无法做到这一点,我可以简单地使用故事板进行主屏幕和segue,并使用单独的.xib文件来定义自定义视图吗?
你怎么做呢?我看到了一个视频教程,但屏幕太小了.此外,除了更改视图大小外,我还需要对我的iphone应用程序进行其他重大更改才能转换为iPad吗?
我通常喜欢在界面构建器中创建和设计我的uiviews.有时我需要在xib中创建一个可以在故事板中的多个视图控制器中重用的视图.
使用Storyboard和xib文件有什么主要区别.
具体来说,使用故事板有什么优缺点?
遗憾的是,尽管进行了大量的研究,我在故事板上找到的所有内容都是简单的教程,向您展示如何设置故事板,而不是具体的信息来解释它们是什么.
我刚刚通过CLI创建了一个新的cordova ios项目,我在Xcode 7.1中打开了该项目,并且在模拟器上运行时在mainViewController.xib上出现了一些错误,如果我们点击该错误它显示的xib文件并在其上显示一个警告消息"发生内部错误.编辑功能可能受限".所以我无法运行这个项目.
我不知道这是由于Xcode bug还是cordova bug或我的Xcode中的任何其他设置问题.
我在xib中创建了一个视图(带有活动指示器,进度视图和标签).然后我创建了.h/.m文件:
#import <UIKit/UIKit.h>
@interface MyCustomView : UIView {
IBOutlet UIActivityIndicatorView *actIndicator;
IBOutlet UIProgressView *progressBar;
IBOutlet UILabel *statusMsg;
}
@end
#import "MyCustomView.h"
@implementation MyCustomView
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
// Initialization code
}
return self;
}
- (void)dealloc {
[super dealloc];
}
@end
Run Code Online (Sandbox Code Playgroud)
在IB中,我将文件的所有者和查看标识设置为MyCustomView并将IBOutlet连接到文件的所有者
在MyViewController.m中,我:
- (void)viewDidLoad {
[super viewDidLoad];
UIView *subView = [[MyCustomView alloc] initWithFrame:myTableView.frame];
[subView setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]];
[myTableView addSubview:subView];
[subView release];
}
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,视图已添加,但我看不到标签,进度条和活动指示器.
我究竟做错了什么?
在目标c中,它可以在init方法中完成
-(id)init{
self = [[[NSBundle mainBundle] loadNibNamed:@"ViewBtnWishList" owner:0 options:nil] objectAtIndex:0];
return self;
}
Run Code Online (Sandbox Code Playgroud)
但是当我快速地这样做时
init(frame: CGRect) {
self = NSBundle.mainBundle().loadNibNamed("ViewDetailMenu", owner: 0, options: nil)[0] as? UIView
}
Run Code Online (Sandbox Code Playgroud)
无法在方法中分配给self自己显示错误.现在我的方法是创建一个视图,并将从nib加载的视图添加到它.谁都有更好的主意?
当我导航到我的一个xib文件时,Xcode将文件标记为触摸.撤消和还原无效.保存似乎没有坏处,但是故障导致我经常额外的git工作.
有没有其他人看到这个或对我的MainWindow.xib中的某些东西有所了解会导致它?
2016年编辑 - 仍在发生!
我是iOS的新手,想知道哪个是最好的学习.我已经在这里阅读了一些答案,但有些人说使用Storyboard会让其他人先说学习XIB.学习XIB有什么好处吗?XIB更容易理解并有助于故事板吗?
xib ×10
ios ×7
xcode ×4
storyboard ×3
uiview ×3
iphone ×2
objective-c ×2
addsubview ×1
autolayout ×1
cordova ×1
ipad ×1
swift ×1
uistoryboard ×1
xcode7.1 ×1