Уволить поповер с помощью UIbutton - PullRequest
4 голосов
/ 25 августа 2010

Я не могу понять, почему это не работает так, как должно, когда я пытаюсь отклонить поповер, нажимая UIButton, который сам по себе находится на попсовере, который должен быть отклонен, мой проект падает ...

- (IBAction) cancelButton: (id) sender{
//[self dismissPopoverAnimated:YES];
}

Выше мой код для моего UIButton

Ответы [ 3 ]

19 голосов
/ 15 февраля 2011

Не отклоняйте поповер изнутри себя. Создайте протокол, который отправит сообщение своему делегату, чтобы затем отклонить его. Например, ваш контроллер представления поповера может выглядеть следующим образом ..

// MyPopoverViewController.h

@protocol MyPopoverDelegate <NSObject>
-(void)didClickCancelButton;
@end

@interface MyPopoverViewController : UIViewController {

}

@property (nonatomic, assign) id<MyPopoverDelegate> delegate; 

-(IBAction)cancelButton;

@end

// MyPopoverViewController.m
#import "MyPopoverViewController.h"

@implementation MyPopoverViewController

@synthesize delegate;

 // The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.

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

-(IBAction)cancelButton {
   [self.delegate didClickCancelButton];
}

#pragma mark -
#pragma mark Rotation support

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Overriden to allow any orientation.
    return YES;
}

#pragma mark -
#pragma mark Memory Management

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.
}


- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {   
    [super dealloc];
}


@end

И тогда вы могли бы использовать ..

//  ClassImplementingPopoverController.h

#import <UIKit/UIKit.h>
#import "MyPopoverViewController.h"

@interface ClassImplementingPopoverController : UIViewController <UIPopoverControllerDelegate, MyPopoverDelegate> {

    UIPopoverController *myPopoverController;
}

@property (nonatomic, retain) UIPopoverController *myPopoverController;

@end

//  ClassImplementingPopoverController.m

#import "ClassImplementingPopoverController.h"
#import "MyPopoverViewController.h"


@implementation ClassImplementingPopoverController

@synthesize myPopoverController;

#pragma mark -
#pragma mark View lifecycle


- (void)viewDidLoad {
    [super viewDidLoad];
}

 // Override to allow orientations other than the default portrait orientation.
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 // Return YES for supported orientations.
     return YES;
 }

#pragma mark -
#pragma mark MyPopover delegate

-(void)didClickCancelButton {
    if ([myPopoverController isPopoverVisible]) {
       [myPopoverController dismissPopoverAnimated:YES];
       [myPopoverController release];
    }
 }

#pragma mark -
#pragma mark UIPopoverController delegate

-(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    if (popoverController == myPopoverController) {
        [myPopoverController release];
    }
}

/* Use something like this to create your popover, just make sure you set the delegate to self so you can receive the messages 

        NSLog(@"Displaying Popover!");
        MyPopoverViewController *detailViewController = [[MyPopoverViewController alloc] initWithNibName:@"MyPopoverViewController" bundle:nil];
        [detailViewController setDelegate:self];
        // Pass the selected object to the new view controller.     
        myPopoverController = [[UIPopoverController alloc] initWithContentViewController:detailViewController];
        [detailViewController release];
        myPopoverController.popoverContentSize = CGSizeMake(500.0, 150.0);
        [myPopoverController setDelegate:self];
*/

#pragma mark -
#pragma mark Memory management

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Relinquish ownership any cached data, images, etc. that aren't in use.
}

- (void)viewDidUnload {
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
    self.myPopoverController = nil;
}


- (void)dealloc {
    [myPopoverController release];
    [super dealloc];
}

@end
3 голосов
/ 23 августа 2012

вы можете использовать KVC для доступа к "popoverController", например

[self valueForKey:@"popoverController"]

Но он может быть отклонен AppStore, если обнаружит, что ваш код использует их "закрытый API".

0 голосов
/ 12 января 2012

dismissPopoverAnimated - это свойство самого PopoverController, а не вашего пользовательского VC.Вы показываете IBAction на «Я», что предполагает, что вы находитесь внутри своего собственного класса здесь.(Пожалуйста, опубликуйте больше окружающего кода, если это не правильно.)

VC не может напрямую попасть в окружающий его поповер;вам просто нужно сохранить ссылку на него в VC, который его создал, чтобы вы могли оттуда ударить с помощью dismiss.

Вы можете отклонить Popover изнутри, который не падает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...