如何使用自己的委托方法添加子视图?

Posted

技术标签:

【中文标题】如何使用自己的委托方法添加子视图?【英文标题】:How to add a subview using own delegate method? 【发布时间】:2012-06-09 11:54:01 【问题描述】:

正如我的屏幕截图所示,我在 SliderValueViewController.xib 上有 UIButton。我希望当我单击此 UIButton 时,它会自动在 Secondview.xib 中添加子视图(名称为 detailview)。这是我的代码。在 SliderValueViewController.h 我声明我的协议,

#import <UIKit/UIKit.h>
@protocol Testmyview

-(void)displayview;

@end


@interface SliderValueViewController : UIViewController 

    IBOutlet UILabel *sliderValue;
    IBOutlet UIButton *btngo;
        id <Testmyview> delegate;


@property (nonatomic, retain) IBOutlet UILabel *sliderValue;
@property (nonatomic, assign)id <Testmyview> delegate;

-(void)updateSliderValueTo:(CGFloat)_value;
-(IBAction)gotodetailview;
@end

在 SliderValueViewController.m 中

           #import "SliderValueViewController.h"
           #import"secondview.h"
           @implementation SliderValueViewController
           @synthesize sliderValue;
           @synthesize delegate;

这是我的按钮功能..

    -(IBAction)gotodetailview
      
         [self.delegate displayview];
      

现在是我的 secondview.h

而我的 secondview.m 看起来就像这样..

   #import "secondview.h"
   #import "SliderValueViewController.h"
   #import "ELCSlider.h"
   @implementation secondview

这是我想要的功能..

  -(void)displayview
    
      [self.view addSubview:detailview];    
   

在 ELSLiderl.m 我这样做..

 -(id)initWithCoder:(NSCoder *)aDecoder 

 if(self = [super initWithCoder:aDecoder]) 
    [self addTarget:self action:@selector(valueChanged) forControlEvents:UIControlEventValueChanged];
    sliderValueController = [[SliderValueViewController alloc] initWithNibName:@"SliderValueViewController" bundle:[NSBundle mainBundle]];
    popoverController = [[UIPopoverController alloc] initWithContentViewController:sliderValueController];
    [popoverController   setPopoverContentSize:sliderValueController.view.frame.size];
     

    return self;    
   

 -(void)valueChanged 

[sliderValueController updateSliderValueTo:self.value];

CGFloat sliderMin =  self.minimumValue;
CGFloat sliderMax = self.maximumValue;
CGFloat sliderMaxMinDiff = sliderMax - sliderMin;
CGFloat sliderValue = self.value;

if(sliderMin < 0.0) 

    sliderValue = self.value-sliderMin;
    sliderMax = sliderMax - sliderMin;
    sliderMin = 0.0;
    sliderMaxMinDiff = sliderMax - sliderMin;


CGFloat xCoord = ((sliderValue-sliderMin)/sliderMaxMinDiff)*[self frame].size.width-sliderValueController.view.frame.size.width/2.0;

CGFloat halfMax = (sliderMax+sliderMin)/2.0;

if(sliderValue > halfMax) 

    sliderValue = (sliderValue - halfMax)+(sliderMin*1.0);
    sliderValue = sliderValue/halfMax;
    sliderValue = sliderValue*11.0;

    xCoord = xCoord - sliderValue;


else if(sliderValue <  halfMax) 

    sliderValue = (halfMax - sliderValue)+(sliderMin*1.0);
    sliderValue = sliderValue/halfMax;
    sliderValue = sliderValue*11.0;

    xCoord = xCoord + sliderValue;


[popoverController presentPopoverFromRect:CGRectMake(xCoord, 0, sliderValueController.view.frame.size.width, sliderValueController.view.frame.size.height) inView:self permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
 

使用所有这些代码,它不会给我带来任何磨损或错误,但它没有添加子视图。当我使用断点时,我的 UIButton 方法(-(IBAction)gotodetailview)被调用但它不调用委托方法方法(-(void)displayview)在 secondview 中。任何人都可以提前帮助我犯什么错误 .thanx。

【问题讨论】:

在 gotodetailview nslog 中 self.delegate 的值并检查它是否为 nil @OmarAbdelhafith 但我们如何检查 NSlog 中 self.delegate 的值。 if(self.delegate == nil) NSLog(@"delegate is nil, error!!"); @Aman 是的,但这并不意味着他的所作所为是错误的! 你在推sliderviewcontroller时设置委托,即sliderviewcontroller.delegate = self 【参考方案1】:

secondview.m

您似乎忘记设置SliderValueViewControllerdelegate 属性

在呈现或推送“SliderValueViewController”的函数中 你会有这样的东西

SliderValueViewController *controller = [[SliderValueViewController alloc] init];
//You will need to add this code
//self is secondview
controller.delegate = self;

现在当[self.delegate displayview]; 接到电话时,这将在secondview 中调用displayview

【讨论】:

@Omerthanx 为您提供帮助..但是我在 secondview 中没有这样的功能来呈现或推动“SliderValueViewController”bcz 我在我的“ELCSlider”中调用“SliderValueViewController”,因为你正在查看屏幕截图..please check it bcz 这个问题在过去 4 小时内让我印象深刻..

以上是关于如何使用自己的委托方法添加子视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何将视图添加为某些控制器的子视图

如何设置滚动视图委托? [关闭]

如何在子线程中访问父线程的空间

向 UITableViewCells 添加子视图会导致滚动时出现问题

这个设置委托方法是如何工作的?

如何删除 UITableViewCell NSIBPrototypingLayoutConstraint 并将我自己的添加到子视图?