我目前正在制作一个具有多个计时器的应用程序,基本上都是相同的.
我想创建一个自定义类,它使用定时器的所有代码以及布局/动画,因此我可以有5个相同的定时器,它们彼此独立地运行.
我使用IB(xcode 4.2)创建了布局,并且定时器的所有代码当前都在viewcontroller类中.
我很难将我的大脑包装成如何将所有内容封装到自定义类中,然后将其添加到viewcontroller,任何帮助都将非常感激.
我到处都在搜索,到目前为止没有什么对我有用.
基本上我想要一个名为rootView.xib的.xib文件,在其中我希望有一个UIView(让我们称之为containerView)只占用屏幕的一半(因此会有常规视图和新视图).然后我想要一个名为firstView.xib的不同.xib文件并将其加载到containerView中.所以我可以在firstView.xib上有一堆东西和rootView.xib中的一堆不同的东西,并在rootView.xib中加载我的firstView.xib在containerView中,但由于它只占用了屏幕的一半,你仍然可以看到rootView.xib上的东西
我知道之前已经问过这个问题,但答案是矛盾的,我很困惑,所以请不要激怒我.
我希望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) 我在读NSArray就是这样的事情.听起来很沉重.我在桌面上有7本非常胖的书,关于Objective-C,Cocoa和C.他们都没有提到Class Cluster,至少我在书的后面的索引中找不到它.那是什么?
我通常喜欢在界面构建器中创建和设计我的uiviews.有时我需要在xib中创建一个可以在故事板中的多个视图控制器中重用的视图.
我正在为拥有自己的子视图而苦苦挣扎UIViewControllers.我有一个UIViewController视图(浅粉色)和两个按钮toolbar.我希望在按下第一个按钮时显示蓝色视图,按下第二个按钮时显示的黄色视图.如果我只是想显示一个视图,应该很容易.但蓝色视图将包含一个表,因此它需要它自己的控制器.那是我的第一课.我从这个SO问题开始,我知道我需要一个控制器用于表.
所以,我要支持并采取一些婴儿步骤.下面是我的Utility ViewController(主视图控制器)和另外两个控制器(蓝色和黄色)的简单起点图片.想象一下,当ViewController首次显示Utility (主视图)时,将显示粉红色视图所在的蓝色(默认)视图.用户可以单击两个按钮来回移动,粉红色视图将永远不会显示.我只想将蓝色视图移到粉红色视图的位置,将黄色视图移到粉红色视图所在的位置.我希望这是有道理的.

我正在尝试使用addChildViewController.从我所看到的,有两种方法可以做到这一点:容器视图storyboard或addChildViewController编程.我想以编程方式进行.我不想使用NavigationController或Tab栏.我只想添加控制器,并在按下相关按钮时将正确的视图推入粉红色视图.
下面是我到目前为止的代码.我想要做的就是显示粉红色视图所在的蓝色视图.从我所看到的,我应该能够addChildViewController和addSubView.这段代码不适合我.我的困惑是让我变得更好.有人可以帮我看到粉红色视图所在的蓝色视图吗?
除了在viewDidLoad中显示蓝色视图外,此代码不用于执行任何操作.
IDUtilityViewController.h
#import <UIKit/UIKit.h>
@interface IDUtilityViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIView *utilityView;
@end
Run Code Online (Sandbox Code Playgroud)
IDUtilityViewController.m
#import "IDUtilityViewController.h"
#import "IDAboutViewController.h"
@interface IDUtilityViewController ()
@property (nonatomic, strong) IDAboutViewController *aboutVC;
@end
@implementation IDUtilityViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.aboutVC = [[IDAboutViewController alloc]initWithNibName:@"AboutVC" bundle:nil];
[self addChildViewController:self.aboutVC];
[self.aboutVC didMoveToParentViewController:self];
[self.utilityView addSubview:self.aboutVC.aboutView];
}
@end
Run Code Online (Sandbox Code Playgroud)
- - - - …
我正在使用最新的SDK开发iOS 5+应用程序.
我创建了一个TopMenuView带有自定义XIB 的自定义UIView().在Interface Builder上,我已经在这个XIB上更改了UIView类TopMenuView.我没有设置任何File's Owner.
在TopMenuView.m我有:
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
NSLog(@"init with coder: %d", counter);
counter++;
// Add custom XIB
NSArray *topMenuView = [[NSBundle mainBundle] loadNibNamed:@"TopMenuView"
owner:nil
options:nil];
UIView *nv = [topMenuView objectAtIndex:0];
[self addSubview:nv];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
使用Interface Builder我添加了UIViewa UIViewController并将此类更改UIView为TopMenuView.
但是,当我运行应用程序时,我收到4251次此日志消息:
2013-10-13 20:49:34.078 MyProject[470:c07] init with coder: 0
然后,我得到一个EXC_BAD_ACCESS:
NSArray *topMenuView …Run Code Online (Sandbox Code Playgroud) 我有一个小的xib文件UIView,它包含一些标签.现在,我正在尝试将其加载UIView到现有文件中UIViewController,并更改其中一个标签文本.我想这样做的原因是,UIView将重复使用不同的标签文本,所以我想制作一个自定义类并从xib加载它将是最好的方法.
我已经尝试了几种加载它的方法,并且我已经在我的viewcontroller上成功显示了它.问题是,一旦我尝试IBOutlet在Interface Builder中实际链接并访问它,我的应用程序崩溃了.
我创建了一个自定义UIView类,如下所示:
CoverPanel.h
@interface CoverPanel : UIView {
IBOutlet UILabel *headline;
}
@property (nonatomic, retain) IBOutlet UILabel *headline;
@end
Run Code Online (Sandbox Code Playgroud)
CoverPanel.m
@implementation CoverPanel
@synthesize headline;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// Initialization code.
//
self = [[[NSBundle mainBundle] loadNibNamed:@"CoverPanel" owner:self options:nil] objectAtIndex:0];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
在CoverPanel.xib,我已经链接UILabel到标题出口.在我的viewcontroller中,这是我如何创建CoverPanel实例,这就是它崩溃的地方:
CoverPanel *panelView = [[CoverPanel alloc] initWithFrame:CGRectMake(0,0,300,100)];
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.它显示与UIView.xib中的布局完全相同.但是一旦我尝试改变 …
我做了一个应用程序内的自定义键盘,取代了系统键盘,当我点击内部时弹出UITextField.
这是我的代码:
class ViewController: UIViewController {
var myCustomKeyboard: UIView!
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let keyboardNib = UINib(nibName: "Keyboard", bundle: nil)
myCustomKeyboard = keyboardNib.instantiateWithOwner(self, options: nil)[0] as! UIView
textField.inputView = myCustomKeyboard
}
}
Run Code Online (Sandbox Code Playgroud)
键盘布局是从xib文件加载的.
如何将按钮文本放入文本字段?
笔记:
更新
为了在我的应用程序中重复使用某个子视图(基于故事板),我决定将子视图构建为nib,然后加载它.为此,我做了以下操作:
我有一个UIView子类,我们可以调用Widget.我创建了一个相应的xib文件,将File owner属性设置为我的新子类,连接IBOutlets.
然后,在我的故事板中,我在视图控制器内部有一个uiview,我将它的类设置为我创建的Widget类.
在widget类中,我重写initWithCoder,并在那里加载nib,如下所示:
-(id)initWithCoder:(NSCoder *)aDecoder{
if ((self = [super initWithCoder:aDecoder])){
[self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"Widget" owner:self options:nil] objectAtIndex:0]];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
应用程序此时会崩溃,并在此处设置断点显示initWithCoder被一遍又一遍地调用.
在这种情况下,我似乎混合了两种使用笔尖的方法,但我不清楚我哪里出错了.如果需要,我可以抛出堆栈跟踪,但它基本上是对同一函数的无限嵌套调用.
我正在尝试创建一个包含2个自定义视图(B)的UIView(A)
视图B使用Autolayout约束进行设置,并在Interface Builder中进行,包括约束.在viewController的Nib中添加了A.
B - UIImageView(前导= 10,尾随= 10,AlignVertically) - UITextField(前导= 10,尾随= 10,AlignVertically)
ViewController A(300x300,AlignHorizontally,AlignVertically)
在ViewController中,我将A固定为300x300,B1和B2的前导,尾随,顶部和底部固定为0.(这应该使B1和B2为300x150,如果我错过了什么,请原谅我)
加载View BI时,使用以下代码加载其Nib:
override func awakeAfterUsingCoder(aDecoder: NSCoder!) -> AnyObject! {
if self.subviews.count == 0 {
let bundle = NSBundle(forClass: self.dynamicType)
var view = bundle.loadNibNamed("B", owner: nil, options: nil)[0] as B
view.setTranslatesAutoresizingMaskIntoConstraints(false)
let constraints = self.constraints()
self.removeConstraints(constraints)
view.addConstraints(constraints)
return view
}
return self
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行时,我收到以下警告,包括崩溃:
The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7f897ad1acc0 V:[TestProject.B:0x7f897af73840(300)]>
When added to a view, the constraint's items must be descendants …Run Code Online (Sandbox Code Playgroud) 我正在子类化UIView尝试从nib文件加载我在界面构建器中删除的视图.我在返回行上收到以下错误:
由于未捕获的异常'NSGenericException'而终止应用程序,原因是:'此编码器要求从initWithCoder返回替换的对象:'
- (id)initWithCoder:(NSCoder *)aDecoder
{
[super initWithCoder:aDecoder];
NSArray *objects = [[NSBundle mainBundle]
loadNibNamed:@"MyView"
owner:nil
options:nil];
if (self = [objects objectAtIndex:0])
{
}
return [self retain];
}
Run Code Online (Sandbox Code Playgroud) ios ×7
uiview ×7
objective-c ×6
iphone ×4
xib ×3
autolayout ×2
nib ×2
xcode ×2
class ×1
cocoa ×1
keyboard ×1
storyboard ×1
subclassing ×1
swift ×1
uistoryboard ×1
uitableview ×1