你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 解析iOS開辟中的FirstResponder第一呼應對象

解析iOS開辟中的FirstResponder第一呼應對象

編輯:IOS開發綜合

1. UIResonder

關於C#裡一切的控件(例如TextBox),都繼續於Control類。而Control類的繼續關系如
下:

System.Object

  System.MarshalByRefObject

    System.ComponentModel.Component

      System.Windows.Forms.Control

關於IOS裡的UI類,也有相似的繼續關系。

例如關於UITextField,繼續於UIControl;UIControl繼續於UIView,UIView繼續於UIRe
sponder,UIResponder繼續於NSObject。

詳細架構可以拜見:

http://developer.apple.com/library/IOS/#documentation/general/conceptual/Devp
edia-CocoaApp/Responder.html

UIResponder是UIKit框架中的類(Mac OS X Cocoa對應的是AppKit框架)。

 

2. 第一呼應對象

在運用的呼應對象裡,會有一個成為第一呼應對象。

第一呼應對象和其他呼應對象之間有甚麼差別?關於通俗的觸摸事宜沒甚麼差別。就算
我把一個按鈕設置成第一呼應對象,當我點擊其他按鈕時,照樣會呼應其他按鈕,而不
會優先呼應第一呼應對象。

第一呼應對象的差別在於擔任處置那些和屏幕地位有關的事宜,例如動搖。

蘋果官方文檔的說法是:第一呼應對象是窗口中,運用法式以為最合適處置事宜的對象

一個班只能有一個班長,運用的呼應對象中,只能有一個呼應對象成為第一呼應對象。

 

3. 成為與撤消第一呼應對象。

要當第一呼應對象,還須要有View來毛遂自薦:

- (BOOL) canBecomeFirstResponder
{
    returnYES;
}

假如缺乏了這段,就算用[view becomeFirstResponder]也不克不及讓一個view成為第一呼應
對象。。。強扭的瓜不甜?好吧不是這個緣由。年夜多半視圖默許只關懷與本身有聯系關系的
事宜,而且(簡直)老是無機會來處置這些事宜。以UIButton為例,當用戶單擊某個UIB
utton對象時,不管以後的第一呼應對象是哪一個視圖,該對象都邑收到指定的舉措新聞。
當上第一呼應對象費勁不谄谀麼。。。所以只能由某個UIResponder明白表現本身情願成
為第一呼應對象才行。(我不曉得設計上是基於甚麼斟酌。。。平安?)

 

在當上第一呼應對象時,分歧對象能夠會有一些特別的表示。例如UITextField當上的時
候,就會調出一塊小鍵盤。

第一呼應對象也有能夠被解雇。發送一個resignFirstResponder,便可以勸退。

 

4. 第一呼應對象的義務

適才說了第一呼應對象可以處置動搖。就來看個典范吧:

 

- (void) motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if(motion == UIEventSubtypeMotionShake)
    {
        NSLog(@"Device is beginning to shake");
        [selfsetCircleColor:[UIColorredColor]];
        [selfsetNeedsDisplay];
    }
}

當動搖開端時觸發某些行動。

 

5. 獲得以後第一呼應對象

源自這篇評論辯論:http://stackoverflow.com/questions/1823317/get-the-current-firs
t-responder-without-using-a-private-api

發問的家伙用了以下的方法來獲得

UIView   *firstResponder = [keyWindow
performSelector:@selector(firstResponder)];

成果被蘋果打回來,說用了非地下的API。。。

因而這家伙只好苦逼地用遞歸了:

implementationUIView (FindFirstResponder)
- (UIView *)findFirstResponder
{
    if (self.isFirstResponder) {       
        return self;    
    }
    for (UIView *subView in self.subviews) {
        UIView *firstResponder = [subView findFirstResponder];
        if (firstResponder != nil) {
            return firstResponder;
        }
    }
    return nil;
}
@end

6.View的FirstResponder的釋放成績
明天碰到一個成績,當我隱蔽失落一個正在接收用戶輸出的UITextField的時刻,鍵盤其實不會消逝,並且鍵盤依然接收用戶輸出,再次顯示該TextField時刻發明在隱蔽狀況下,一切的輸出依然傳輸到了該TextField中,因而查下官方材料找到以下說明:
 
Important If you hide a view that is currently the first responder, the view does not automatically resign its first responder status. Events targeted at the first responder are still delivered to the hidden view. To prevent this from happening, you should force your view to resign the first responder status when you hide it.   
 
  意思是假如這個View是以後的第一呼應者的時刻,隱蔽該View其實不會主動廢棄其第一呼應者的身份,並且會持續以第一呼應者的身份接收新聞。我們可以經由過程在隱蔽View之前,手動挪用resignFirstResponder來強迫該view廢棄第一呼應者身份。
 
  上面請看小例子:

SvTestFirstResponder.h

//
//  SvTestFirstResponder.h
//
//  Created by maple on 3/15/12.
//  Copyright (c) 2012 SmileEvday. All rights reserved.
//
//  當一個view時以後呼應者時,挪用其hidden辦法其實不會主動廢棄第一呼應者身份,一切的新聞依然會發送到這個view
//  可以經由過程在hidden前強迫廢棄第一呼應者,恢復正常的新聞傳遞
//

#import <UIKit/UIKit.h>

@interface SvTestFirstResponder : UIView {
    UITextField *_inputField;
}

@end


SvTestFirstResponder.m

//
//  SvTestFirstResponder.m
//
//  Created by maple on 3/15/12.
//  Copyright (c) 2012 SmileEvday. All rights reserved.
//

#import "SvTestFirstResponder.h"

@interface SvTestFirstResponder()

- (void)hiddenInputView:(id)sender;
- (void)shoWinputView:(id)sender;

@end

@implementation SvTestFirstResponder

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
       
        _inputField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 200, 50)];
        _inputField.center = CGPointMake(160, 50);
        [_inputField setFont:[UIFont systemFontOfSize:24]];
        _inputField.text = @"input you text";
        _inputField.clearsOnBeginEditing = YES;
        _inputField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        _inputField.borderStyle = UITextBorderStyleRoundedRect;
        [self addSubview:_inputField];
        _inputField.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
       
        UIButton *hiddenBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        hiddenBtn.frame = CGRectMake(0, 0, 115, 40);
        hiddenBtn.center = CGPointMake(80, 110);
        [hiddenBtn setTitle:@"Hide TextField" forState:UIControlStateNormal];
        [hiddenBtn addTarget:self action:@selector(hiddenInputView:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:hiddenBtn];
        hiddenBtn.autoresizingMask = UIViewAutoresizingFlexibleRightMargin;
        hiddenBtn.titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
       
        UIButton *showBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        showBtn.frame = CGRectMake(0, 0, 115, 40);
        showBtn.center = CGPointMake(240, 110);
        [showBtn setTitle:@"Show TextField" forState:UIControlStateNormal];
        [showBtn addTarget:self action:@selector(showInputView:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:showBtn];
        showBtn.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
        showBtn.titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    }
    return self;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

- (void)hiddenInputView:(id)sender
{
    _inputField.hidden = YES;
}

- (void)showInputView:(id)sender
{
    _inputField.hidden = NO;
}

@end

這個簡略的例子中,當輸出框進入接收用戶輸出狀況的時刻,點擊hide按鈕,鍵盤其實不會消逝並且會持續吸收用戶輸出而且將用戶輸出傳到TextField中去,前面再點擊Show按鈕的時刻你會發明一切在隱蔽狀況下輸出的文字都曾經勝利的被吸收。我們可以修正hide辦法以下:
 

- (void)hiddenInputView:(id)sender

{

    if (_inputField.isFirstResponder) {

        [_inputField resignFirstResponder];

    }

    _inputField.hidden = YES;

}

  如許便可以在隱蔽之前強迫釋放第一呼應者身份,這個成績比擬細節,但有時刻能夠就是這類細節成績招致一些莫名奧妙的成績,在隱蔽一些能夠成為第一呼應者的view之前添增強制釋放第一呼應者身份,能夠會幫我們防止一些奇異的成績,並且也簡直不會有甚麼開支,何樂而不為呢。

【解析iOS開辟中的FirstResponder第一呼應對象】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved