自定义委托方法未使用其自定义委托在其他自定义类中调用

时间:2014-09-09 10:35:36

标签: ios objective-c delegates

我有两个自定义代理类。 First类具有在视图控制器中正确调用的必需方法。当我尝试在具有自己的委托的第二个类中使用第一个类的委托方法时,没有任何反应。我看到委托方法从未被调用过。以下是这两个类的类接口声明: A类:

@class ServerCommunication;
@protocol ServerCommunicationDelegate;

@interface ServerCommunication : NSObject


@property (weak, nonatomic) id <ServerCommunicationDelegate> delegate;

-(void)requestPageXMLForURLString:(NSString *)stringURL;
-(void)getPreviewBlastsListXMLFromBlastsListItems:(NSString *)blastsIdsString;

@end

@protocol ServerCommunicationDelegate <NSObject>

@required

- (void)didFinishUIXMLRequestWithSuccess:(NSString *)responseXMLString;
@end

B类:

@class AnnotationsListViews;
@protocol AnnotationsListViewsDelegate;

@interface AnnotationsListViews : NSObject<ServerCommunicationDelegate>
{
GDataXMLDocument *listViewXML;
}

 @property (weak, nonatomic) id <AnnotationsListViewsDelegate> delegate;

 @property (strong, nonatomic) NSString *blastsIds;

 - (id)initWithBlastsIds:(NSString *)blastsIdsString;
 -(void)getPreviewBlastsListXMLFromBlastsListItems:(NSString *)blastsIdsString;

 @end
 @protocol AnnotationsListViewsDelegate <NSObject>

 @required
 -(void)selectedAnnotationsListTitleText:(NSString *)listTitle;
 -(void)annotationsListViewsGeneratedWithViewsArray:(NSArray *)requestedBlastsListItemsViews;

@end 以下是B类.m文件中调用第一类&#39;委托方法的方法:

-(void)getXML:(NSString *)blastsIdsString{
   ServerCommunication *connectionToServer=[[ServerCommunication alloc] init];
   connectionToServer.delegate=self;
   [connectionToServer getPreviewBlastsListXMLFromBlastsListItems:blastsIdsString];
}

代码的最后一行工作正常,调用&#34; getPreviewBlastsListXMLFromBlastsListItems&#34;从头等舱。执行第二类中的每一行代码。但是跟随委托方法不会被调用。 代表被召集:

#pragma mark - ServerCommunicationDelegate
- (void)didFinishUIXMLRequestWithSuccess:(NSString *)responseXMLString{
    NSLog(@"sasasassasasasasasasaa");
}

相同的调用方法和委托方法,我一直在我的所有视图控制器类中使用它们工作正常。 在这种情况下,我看到甚至 NSLog 不会打印任何内容。我认为在从NSObject类继承的类中有一些独立的处理调用委托方法。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

ServerCommunication *connectionToServer设为@property,例如

@property (strong, nonatomic) ServerCommunication *connectionToServer;

并将getXML:方法更改为

-(void)getXML:(NSString *)blastsIdsString{
   self.connectionToServer=[[ServerCommunication alloc] init];
   self.connectionToServer.delegate=self;
   [self.connectionToServer getPreviewBlastsListXMLFromBlastsListItems:blastsIdsString];
}

同时制作B类的实例即。 AnnotationsListViews@property

答案 1 :(得分:1)

调用connectionToServer方法后,getXML:是否会自行释放。所以没有什么能够给代表打电话。检查connectionToServer是否为零,您可能需要暂停connectionToServer才能将其作为财产或保留。

答案 2 :(得分:0)

您可以在Manage completion handler of NSURLSession from a custom class

查看解决方案

代表解释。

此致 阿米特

答案 3 :(得分:0)

See My Example.


//
//  AppModel.swift
//  SampleProject
//
//  Created by on 21/09/15.
//  Copyright (c) 2015. All rights reserved.
//

import UIKit
import Foundation

@objc protocol AppmodelDelegate {

// define delegates
    optional func loginSuccess()
    optional func logOutSuccess()
    optional func loginFailed(error_message:String?)
    optional func propertyFetchingSuccess()

}

class AppModel: NSObject {

// class body.


//sharing instance to access

    final  class var sharedInstance : AppModel {
        struct Static {
            static var instance : AppModel?
        }
        if !(Static.instance != nil) {
            Static.instance = AppModel()
        }
        return Static.instance!
    }


 }


Delegate call: eg. self.delegate?.propertyFetchingSuccess!()


Implementing in LoginViewController:


//
//  LoginViewController.swift
//  SampleProject
//
//  Created by on 21/09/15.
//  Copyright (c) 2015. All rights reserved.
//

import UIKit

class LoginViewController: UIViewController, UITextFieldDelegate, UIScrollViewDelegate, AppmodelDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        AppModel.sharedInstance.delegate = self

}

    func propertyFetchingSuccess() {

println("propertyFetchingSuccess!!!")
    }
}