当用户点击"完成"时,我正在尝试让我的可编辑UITextView辞职键盘(resignFirstResponder).使用a UITextField,我已经能够使用以下代码执行此操作:
- (IBAction)doneEditing:(id)sender {
[sender resignFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)
...然后将其附加到UITextFieldInterface Builder中的相关内容到"退出时已结束"操作.
然而,有了一个UITextView,我似乎无法访问"退出时结束"动作.有关如何实现这一目标的任何建议?
我正在尝试学习Apple的Swift.我最近尝试构建一个GUI应用程序,但我有一个问题:
如何与应用的GUI元素进行交互?例如,我使用界面构建器来创建UILabel,然后通过按住Control键点击它将它连接到我的viewcontroller,这样我就得到了@IBOUTLET.现在,在我的视图控制器中,如何编辑此UILabel的文本?换句话说,我可以使用什么代码以编程方式控制故事板上某些内容的文本?我在网上找到的所有方法似乎只能使用代码生成的按钮,而不是故事板上生成的按钮.
我见过像这样的代码
self.simpleLabel.text = "message"
Run Code Online (Sandbox Code Playgroud)
如果这是正确的,我如何将其与相关标签链接?换句话说,我如何调整此代码以与IBOutlet连接(如果这就是我的工作)
当你读到这里在大多数情况下,IBOutlet应该是弱.
现在,您可以在开发库中阅读并非所有类都支持弱引用.(例如NSTextView).这意味着您必须使用assign:
@property (assign) IBOutlet NSTextView *textView;
Run Code Online (Sandbox Code Playgroud)
如果使用弱引用,您将收到以下错误:"不允许合成弱不可用属性,因为它需要合成__weak对象的ivar"
文档错过的内容是现在你必须在使用后再将属性设置为nil,例如通过一种dealloc方法:
- (void)dealloc
{
self.textView = nil;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,标NS_AUTOMATED_REFCOUNT_WEAK_UNAVAILABLE有的类不支持弱引用,但原因是什么?
我熟悉为我自己的UIView子类创建XIB的大部分过程,但并不是所有的东西都适合我 - 这主要与IBOutlets链接有关.我可以让它们以迂回的方式工作.
我的设置是这样的:
我的init方法是我遇到问题的地方.
我尝试使用NSBundle mainBundle的'loadNibNamed'方法并将所有者设置为'self',希望我创建一个视图实例,它会自动将它的出口与我班级的出口相匹配(我知道)怎么做,我很小心).然后我想我想让'self'等于那个nib中索引0的子视图,而不是做
self = [super init];
Run Code Online (Sandbox Code Playgroud)
或类似的东西.
我觉得我在这里做错了,但是在线的例子在init方法中有类似的事情,但他们将子视图0分配给view属性并将其作为子项添加 - 但是那不是总共两个MyClass实例?一个基本上与IBOutlets无关,包含通过loadNibNamed实例化的子MyClass?或者充其量,它不是一个MyClass实例,带有一个额外的中间UIView,其中包含我最初想要的所有IBOutlets作为MyClass的直接子项吗?当涉及到像instanceOfMyClass.frame.size.width这样的事情时,这会带来轻微的烦恼,因为它返回0,当引入的子UIView返回我正在寻找的实际帧大小时.
我在做错的是我在init方法中搞乱了loadNibNamed吗?我应该做更像这样的事情吗?
MyClass *instance = [[MyClass alloc] init];
[[NSBundle mainBundle] loadNibNamed:@"MyClass" owner:instance options:nil];
Run Code Online (Sandbox Code Playgroud)
或者像这样?
MyClass *instance = [[[NSBundle mainBundle] loadNibNamed:@"MyClass" owner:nil options:nil] objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的任何帮助.
每:
@IBOutlet weak var nameLabel: UILabel!
Run Code Online (Sandbox Code Playgroud)
每当我声明我的IBOutlets时,我只使用var而不是weak var.但我最近遇到了一些使用弱var的代码模板.他们为什么这样做?还有什么好处?
为什么在UILabel结束时会有一个爆炸操作员.我知道这是必需的,我和它一起去,但现在就问它.
提前致谢.
我正在开发一个iPhone应用程序,并且在控制器中获取(null)对IBOutlet字段的引用.我有一个UIViewController子类,在我的XIB中设置为File的所有者.我有一组连接到控制器的UI元素.从NIB加载并尝试在这些UI元素上设置属性后,我发现它们是(null).澄清一些代码:
ExpandSearchPageController.h:
@interface ExpandSearchPageController : UIViewController
{
IBOutlet UITextView * completeMessageView;
}
-(void)checkTextField;
@property (nonatomic, retain) IBOutlet UITextView * completeMessageView;
Run Code Online (Sandbox Code Playgroud)
ExpandSearchPageController.m:
@implementation ExpandSearchPageController
@synthesize completeMessageView;
-(void)checkTextField
{
NSLog(@"text field: %@",completeMessageView);
}
Run Code Online (Sandbox Code Playgroud)
ExpandSearchPageController被设置为ExpandSearchPage.xib的文件所有者.ExpandSearchPage.xib的UITextView连接到completeMessageView.
我打电话的时候
ExpandSearchPageController * searchExpanderPage = [[ExpandSearchPageController alloc] initWithNibName:@"ExpandSearchPage" bundle:[NSBundle mainBundle]];
[searchExpanderPage checkTextField];
Run Code Online (Sandbox Code Playgroud)
结果是
"text field: (null)"
Run Code Online (Sandbox Code Playgroud) 我有一个自定义UIView类.在里面我宣布了一个 IBOutlet属性UIImageView.
#import <UIKit/UIKit.h>
@interface SettingItem : UIView{
}
@property (strong, nonatomic) IBOutlet UIImageView *myImage;
@end
Run Code Online (Sandbox Code Playgroud)
现在我正在使用故事板.有一个viewcontroller.我拖到UIView了viewcontroller.我拖了一个UIImageView作为上面的子视图UIView.我将"SettingItem"类设置UIView为storyboard.我通过SettingItem从实用程序窗口的出口正常拖动将插座连接到myImage .
SettingItem 履行#import "SettingItem.h"
@implementation SettingItem
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[self baseInit];
}
return self;
}
-(id) initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self) {
// Initialization code
[self baseInit];
}
return self;
}
- (void) baseInit{ …Run Code Online (Sandbox Code Playgroud) 我创造了一个UIViewController我们可以打电话的人MyViewController1.当我打电话MyViewController1,我所有的IBOutletARE 零的viewDidLoad(以及其他代码太).
当我通过这样做创建这个控制器时
MyViewController1 *vc = [[MyViewController1 alloc] init],
MyViewController1例如MyViewController2,如果我替换另一个,它就可以了.所以我猜问题确实存在MyViewController1.
你可能想知道的最后一件事,就是MyViewController1实际上是一个子类,MySuperViewController1这是一个UIViewController.
谢谢你的帮助 !
编辑
我意识到我的情况可能更复杂.这是我的确切文件:
// MySuperViewController1
MySuperViewController1.h
MySuperViewController1.m
MySuperViewController1.xib
Run Code Online (Sandbox Code Playgroud)
// MyViewController1
MyViewController1.h
MyViewController1.m
Run Code Online (Sandbox Code Playgroud)
所以nib属于超类,而不是子类.我能这样做吗?
我目前正在重构一些共享一些IBOutlets和IBAction方法的视图控制器.我将插座声明和IBAction方法移动到一个超类中,从子类中删除它们.
现在,当我打开Interface Builder时,我发现我无法看到超类中声明的出口或动作.这些连接仍然存在,因为我在重构之前将它们连接起来,但是它们已经变灰了.(重要的是要注意连接也是工作,因为我的操作在按下按钮时触发,我的插座被正确修改.)
问题是,如何让界面构建器识别来自超类的出口?这是可能的,如果没有,你们都推荐什么?
(只是为了好玩,这是我的超类头文件:)
@interface TFMainViewController : UIViewController {
UIImageView *logoImage, *thinkfunImage;
UIButton *buyFullButton;
}
@property (nonatomic, retain) IBOutlet UIImageView *logoImage, *thinkfunImage;
@property (nonatomic, retain) IBOutlet UIButton *buyFullButton;
-(IBAction) buyFullVersion;
@end
Run Code Online (Sandbox Code Playgroud)
编辑:如果有人想知道,我正在使用Xcode和IB 3.2.5,iOS 4.2 SDK.
我nib在Swift中创建了一个包含文件的自定义视图(Quantity View).我在自定义视图中创建了一些IBOutlets&IBActions(用于按钮,标签等).
我试图通过在我的故事板中为类别指定类名来使用此自定义视图(数量视图).它显示了我在Connections Inspector中的所有&,如此屏幕截图所示:UIViewIBOutletsIBActions
.
我只想显示delegate自定义视图.
可能的答案:
我以为我可以使用它-viewWithTag来获取视图而不是Outlets.
但是,我想知道是否可以使用奥特莱斯或者是否有更好的方法来做到这一点?
处理这种情况的其他可能方式(最佳)是什么?
iboutlet ×10
ios ×7
objective-c ×3
swift ×3
iphone ×2
uiview ×2
ibaction ×1
init ×1
loadnibnamed ×1
nstextview ×1
null ×1
operators ×1
retain ×1
storyboard ×1
uilabel ×1
uitextview ×1
weak ×1
xcode ×1