相关疑难解决方法(0)

如何创建自定义iOS视图类并实例化其多个副本(在IB中)?

我目前正在制作一个具有多个计时器的应用程序,基本上都是相同的.

我想创建一个自定义类,它使用定时器的所有代码以及布局/动画,因此我可以有5个相同的定时器,它们彼此独立地运行.

我使用IB(xcode 4.2)创建了布局,并且定时器的所有代码当前都在viewcontroller类中.

我很难将我的大脑包装成如何将所有内容封装到自定义类中,然后将其添加到viewcontroller,任何帮助都将非常感激.

xcode class uiviewcontroller uiview ios

110
推荐指数
4
解决办法
9万
查看次数

如何在UIView中加载xib文件

我到处都在搜索,到目前为止没有什么对我有用.

基本上我想要一个名为rootView.xib的.xib文件,在其中我希望有一个UIView(让我们称之为containerView)只占用屏幕的一半(因此会有常规视图和新视图).然后我想要一个名为firstView.xib的不同.xib文件并将其加载到containerView中.所以我可以在firstView.xib上有一堆东西和rootView.xib中的一堆不同的东西,并在rootView.xib中加载我的firstView.xib在containerView中,但由于它只占用了屏幕的一半,你仍然可以看到rootView.xib上的东西

objective-c xib uiview ios

109
推荐指数
6
解决办法
15万
查看次数

正确的加载UIView子类的Nib的方法

我知道之前已经问过这个问题,但答案是矛盾的,我很困惑,所以请不要激怒我.

我希望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)

iphone objective-c xib uiview ios

98
推荐指数
5
解决办法
10万
查看次数

Objective-C中究竟是什么叫做"类群"?

我在读NSArray就是这样的事情.听起来很沉重.我在桌面上有7本非常胖的书,关于Objective-C,Cocoa和C.他们都没有提到Class Cluster,至少我在书的后面的索引中找不到它.那是什么?

cocoa objective-c cocoa-design-patterns class-cluster

89
推荐指数
5
解决办法
3万
查看次数

在故事板中重用uiview xib

我通常喜欢在界面构建器中创建和设计我的uiviews.有时我需要在xib中创建一个可以在故事板中的多个视图控制器中重用的视图.

interface-builder xib uiview uistoryboard autolayout

74
推荐指数
4
解决办法
3万
查看次数

如何在Objective-C中添加具有自己的UIViewController的子视图?

我正在为拥有自己的子视图而苦苦挣扎UIViewControllers.我有一个UIViewController视图(浅粉色)和两个按钮toolbar.我希望在按下第一个按钮时显示蓝色视图,按下第二个按钮时显示的黄色视图.如果我只是想显示一个视图,应该很容易.但蓝色视图将包含一个表,因此它需要它自己的控制器.那是我的第一课.我从这个SO问题开始,我知道我需要一个控制器用于表.

所以,我要支持并采取一些婴儿步骤.下面是我的Utility ViewController(主视图控制器)和另外两个控制器(蓝色和黄色)的简单起点图片.想象一下,当ViewController首次显示Utility (主视图)时,将显示粉红色视图所在的蓝色(默认)视图.用户可以单击两个按钮来回移动,粉红色视图将永远不会显示.我只想将蓝色视图移到粉红色视图的位置,将黄色视图移到粉红色视图所在的位置.我希望这是有道理的.

简单的故事板图像

我正在尝试使用addChildViewController.从我所看到的,有两种方法可以做到这一点:容器视图storyboardaddChildViewController编程.我想以编程方式进行.我不想使用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)

- - - - …

objective-c uitableview uiviewcontroller uicontainerview

53
推荐指数
2
解决办法
3万
查看次数

使用自定义XIB的自定义UIView上的EXC_BAD_ACCESS

我正在使用最新的SDK开发iOS 5+应用程序.

我创建了一个TopMenuView带有自定义XIB 的自定义UIView().在Interface Builder上,我已经在这个XIB上更改了UIViewTopMenuView.我没有设置任何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并将此类更改UIViewTopMenuView.

但是,当我运行应用程序时,我收到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)

objective-c uiview ios

18
推荐指数
3
解决办法
1万
查看次数

从xib加载UIView,在尝试访问IBOutlet时崩溃

我有一个小的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中的布局完全相同.但是一旦我尝试改变 …

iphone xcode uiview nib

8
推荐指数
1
解决办法
8979
查看次数

如何使用应用内自定义键盘的按钮输入文本

我做了一个应用程序内的自定义键盘,取代了系统键盘,当我点击内部时弹出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文件加载的.

如何将按钮文本放入文本字​​段?

笔记:

  • 有许多关于制作自定义系统键盘的教程(需要安装),但我只想要一个应用内键盘.教程使用一个特殊的视图控制器只为键盘,但在这里似乎我只是设置键盘视图.
  • 我已经阅读了数据输入自定义视图文档.
  • 是我能找到的最接近的Stack Overflow问题,但它没有描述如何从按钮获取文本.

更新

  • 本教程似乎表明自定义输入视图有一个视图控制器.但是,我在Objective-C代码中迷失了方向.Swift的过程是什么?
  • 这个答案提到了符合的UIKeyInput协议UITextField,但我该如何使用它?
  • 如果有任何内置方式也可以制作自定义应用内键盘,我真的更喜欢制作一个普通的自定义视图.

keyboard ios swift

8
推荐指数
1
解决办法
2565
查看次数

在故事板中实例化xib时对initWithCoder的无限递归调用

为了在我的应用程序中重复使用某个子视图(基于故事板),我决定将子视图构建为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被一遍又一遍地调用.

在这种情况下,我似乎混合了两种使用笔尖的方法,但我不清楚我哪里出错了.如果需要,我可以抛出堆栈跟踪,但它基本上是对同一函数的无限嵌套调用.

storyboard nib ios

5
推荐指数
1
解决办法
3798
查看次数

使用自动布局约束将子类UIView添加到Nib

我正在尝试创建一个包含2个自定义视图(B)的UIView(A)

视图B使用Autolayout约束进行设置,并在Interface Builder中进行,包括约束.在viewController的Nib中添加了A.

B - UIImageView(前导= 10,尾随= 10,AlignVertically) - UITextField(前导= 10,尾随= 10,AlignVertically)

ViewController A(300x300,AlignHorizo​​ntally,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)

iphone interface-builder ios autolayout

5
推荐指数
2
解决办法
4200
查看次数

iPhone - 从nib文件加载UIView?

我正在子类化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)

iphone objective-c uiview subclassing

4
推荐指数
1
解决办法
8657
查看次数