UITextView 的自定义委托

Posted

技术标签:

【中文标题】UITextView 的自定义委托【英文标题】:Custom Delegate fo UITextView 【发布时间】:2012-06-13 20:46:19 【问题描述】:

我是 UITextView 的子类,并且我得到了它的工作,但我还想在调用 UITextView 委托方法时做一些额外的工作。这是我到目前为止所拥有的。

ThanaaTextView.h

#import <UIKit/UIKit.h>

#import "ThaanaDelegate.h"


@interface ThaanaTextView : UITextView  

    @private
    ThaanaDelegate * _thaanaDelegate;


ThanaaTextView.m

#import "ThaanaTextView.h"


@implementation ThaanaTextView

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
       //do some extra stuff to textview
       //set delegate
       self.delegate = _thaanaDelegate;



    
    return self;





@end

这是我的委托课程

ThaanaDelegate.h

 #import <UIKit/UIKit.h>
 #import <Foundation/Foundation.h>


@interface ThaanaDelegate : NSObject <UITextViewDelegate> 

    NSMutableArray* _lines;


   +(NSString*) reverseText:(NSString*) text withFont:(UIFont*) font carretPosition:(NSRange*) cpos Lines:(NSMutableArray*) lines Bounds:(CGRect) bounds;
-(void) setText:(NSString*) txt textview:(UITextView *)textView;


@end

ThaanaDelegate.m

 -(BOOL) textView:(UITextView*) textView shouldChangeTextInRange:(NSRange) range replacementText:(NSString*) text 
    //delegate method i want to do things in

    return NO;




-(void) setText:(NSString*) txt textview:(UITextView *)textView 

    //stuff
    return txt;

它编译并运行没有错误。但从不调用委托函数。我错过了什么。

【问题讨论】:

【参考方案1】:

当您初始化 ThanaTextView 时,委托尚未设置。

self.delegate = _thaanaDelegate;

_thaanaDelegate 此时为零。因此,您将其设置为 nil。

编辑:

ThaanaTextView *ttv = [[ThaanaTextView alloc] initWithFrame:textViewFrame];
ttv.delegate = someDelegateHere;

【讨论】:

您可以在您的 init 方法之后设置它(不是在您的方法中,而是在调用它之前)。或使用自定义初始化方法,如 initWithDelegate ... 您必须在创建对象后设置它。 @user1226119 在 alloc 之后但在 init 之前设置属性是一个非常糟糕的主意。 @CrimsonDiego,天哪,我写的时候累了。显然你必须在分配之后设置它。 我知道。我说的是在 after alloc 之前但在 init 之前设置它是一个坏主意,因为它违反了 Cocoa 约定。疲倦不是抨击某人的借口。下次请仔细阅读。

以上是关于UITextView 的自定义委托的主要内容,如果未能解决你的问题,请参考以下文章

iOS UITextView 委托

Swift-自定义 UITableViewCell 委托给 UIViewController 只有一个协议有效

如何使 UITextView 的两个类代表?

如何在 XIB 中调用 UITextField 的委托方法?

键盘附件视图隐藏文本

UITextView 委托行为与自定义 iOS 键盘 (SwiftKey) 不同