iOS键盘返回处理程序

时间:2012-01-19 00:37:05

标签: objective-c ios

我是Mac,iOS,Xcode和objective-c的新手。我非常熟悉Windows世界(.net,C#,Silverlight等),但这些都不适用于我在Mac上所做的事情。

所以简而言之,我希望你能帮助我指出各种各样的指针和代码。网上有很多文章(很多关于堆栈溢出的文章),你很容易迷失在所有关于如何做事的意见中。

所以我决定尝试一些简单的事情,例如让iOS键盘对Next和Done做出反应,在键盘上方显示一个工具栏,并使文本字段移动以便为键盘留出空间。我在这里的第一个示例是简单的一个,三个文本字段,两个使用Next,最后一个使用Done来关闭键盘。

enter image description here

我将UITextFieldDelegate和每个文本字段的IBOutlet添加到头文件中。同时按住Ctrl键拖动文本字段到IBOutlet上进行连接。

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (weak, nonatomic) IBOutlet UITextField* firstNameTextField;
@property (weak, nonatomic) IBOutlet UITextField* lastNameTextField;
@property (weak, nonatomic) IBOutlet UITextField* cityTextField;

@end

在源文件中,我添加了文本字段的synthesize语句,viewDidUnload中的set为nil以标记要释放的内存(使用自动内存释放模式)和textFieldShouldReturn方法来设置文本字段的焦点

#import "ViewController.h"

@implementation ViewController

@synthesize firstNameTextField = _firstNameTextField;
@synthesize lastNameTextField = _lastNameTextField;
@synthesize cityTextField = _cityTextField;

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [self setFirstNameTextField:nil];
    [self setLastNameTextField:nil];
    [self setCityTextField:nil];

    [super viewDidUnload];    
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField
{
    if (theTextField == self.firstNameTextField)
    {
        [self.lastNameTextField becomeFirstResponder];
    }
    else if (theTextField == self.lastNameTextField)
    {
        [self.cityTextField becomeFirstResponder];
    }
    else
    {
        [theTextField resignFirstResponder];
    }

    return YES;
}
@end

这是你怎么做的?

从Objective-c的角度来看,你会把*(用于指针)放在名称的前面吗?

@property (weak, nonatomic) IBOutlet UITextField* firstNameTextField;

VS

@property (weak, nonatomic) IBOutlet UITextField *firstNameTextField;

内存管理是否正确?记忆是否会被正确释放,保持活力等?

感谢。

2 个答案:

答案 0 :(得分:1)

如果您是唯一的开发人员,*将由您定义,或者如果您在某个群组中工作,则由您定义编码标准&gt;保持稳定。

我没有查看内存中的内容,但您可能需要查看UITextField的{​​{1}}属性。您可以为该属性分配inputAccessoryView,例如UIView。在工具栏中,添加UIToolbarnextprevious按钮。这提供了类似于其他许多应用程序的行为 - 例如saffari - 做这样的事情。

答案 1 :(得分:1)

正如安东尼所说,星号的位置确实是风格的关注点。我个人更喜欢实例(Class * classInstance)的*,因为它是你指向的实例,而不是类。但意见不同。

一般情况下,代码很好,除非您已将所有属性定义为弱。因为您希望在视图控制器的生命周期中保留这些IBOutlet属性,所以它们应该很强大。即使您已经在IB中构建了视图,您的视图控制器仍然“拥有”那些IB对象。

将属性类型定义为:

@property (strong, nonatomic) AClass *aClassInstance;

这意味着您的对象在分配时将被保留。在这种情况下,分配是通过连接您的插座而进行的,您不需要手动分配,但仍然会发生保留:

[self setProperty:object] //retains 'object'

当你没有它时发布:

[self setProperty:nil] //releases 'object' currently retained by property

如果/当(如你所做的那样)你确实想要一个弱属性(例如,引用你不拥有的对象):

@property (weak, nonatomic)

稍后您不需要在viewDidUnload中将其设置为nil来“释放”它。将它设置为零仍然是一种很好的做法,但不需要平衡你的记忆。