0

各位程序员好,

首先,对不起,很长的帖子。我的问题很简单,但我想确保你知道我在做什么,我真的不想改变我的方法的基本思想。

(以下全部以编程方式完成,没有故事板,没有笔尖,没有导航控制器)

我有一个没有自己视图的 RootViewController。他所做的只是实例化其他 ViewController,管理它们的转换并将它们的视图推送(添加)到主窗口中。为了正确定位这些视图,我想获取 RootViewCONtrollers 子控制器之一的边界/框架。这就是我从 appDelegate 创建 RootViewController 的方式(我从一个空项目开始)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor grayColor];
    self.window.rootViewController = [[UCRootViewController alloc]init];
    [self.window makeKeyAndVisible];
    return YES;
}

在他初始化之后,rootviewController 创建了一个 MapViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    NSLog(@"RootviewController initialized");
    self.mapviewController = [[UCMapviewController alloc] initWithDelegate:self];
    self.view = self.mapviewController.view;
    [self.mapviewController.view setOpaque:YES];
    [self.view bringSubviewToFront:self.mapviewController.view];
    [self presentModalViewController:self.mapviewController animated:YES];
    self.currentlyActiveController = self.mapviewController;
}

MapViewController 创建一个 navigationBar 和一个 MKMapView。现在我设置了硬编码的框架,因为我无法viewDidLoad()在 MapViewController 中获取窗口的边界/框架当我尝试获取有关边界/框架的任何信息时,我得到 0 返回。

- (void)viewDidLoad
{
    NSLog(@"MapviewController initialized");
    [super viewDidLoad];

    self.isMapViewPushedAside = NO;
    // Custom initizialation for navigationBar
    [self setupNavigationBar];

    // Custom initialization for mapview
    [self setUpMapview];
    [self trackUserLocation];

    // Custom initialization for popupActionsButton
    [self setUpPopupButtons];

    // Custom tests
    [self test];

    [self focusLocationOnMap:self.locationManager.location.coordinate];
    [self.locationManager stopUpdatingLocation];
}

我已经实现了两个为窗口返回框架/边界(相同)的委托方法。问题是,我必须在一开始就获取这些值,而不是在所有内容都初始化之后。一切就绪后,当我从按钮调用委托方法时,它们按预期工作。

CGRect frame = [self.mapDelegate frameData];
NSLog(@"width by frame: %f", frame.size.width);
NSLog(@"height by frame: %f", frame.size.height);

CGRect bounds = [self.mapDelegate boundsData];
NSLog(@"width by bounds: %f", bounds.size.width);
NSLog(@"height by bounds: %f", bounds.size.height);

我如何在开始时获得框架/边界,即在调用我的自定义“设置”方法之前......?!

4

1 回答 1

4

我有一个没有自己视图的 RootViewController。

你不能有一个没有视图的 UIViewController。如果你有应用程序将崩溃。当你初始化一个 UIViewController 时,它会自动为你创建一个 UIView。

- (void)viewDidLoad
{
    [super viewDidLoad];
    ..
    self.mapviewController = [[UCMapviewController alloc] initWithDelegate:self];
    self.view = self.mapviewController.view;
    ..
}

从我在这里可以看到,您实际上是在将 RootviewController 的视图设置为地图视图。这应该通过覆盖-(void)loadView控制器的方法来完成,并且您需要设置视图:

-(void)loadView
{
    self.mapviewController = [[UCMapviewController alloc] initWithDelegate:self]; //if you're not using ARC this should be autoreleased;
    self.view = self.mapviewController.view;
}

调用方法时viewDidLoad,控制器的任何视图中都没有设置几何图形。它们只被初始化(隐式或显式地-(void)loadView),然后viewDidLoad被调用。几何最早是在viewWillAppear:方法和连续viewDidAppear:方法中设置的,因此viewWillAppear:您可以拥有视图的实际框架/边界的最早点,并且在viewWillAppear:方法中您应该只执行一些轻量级操作(如设置几何、启动计时器、订阅观察者等..)。
你说你不想改变你的方法,但你需要按照这些规则进行设计。

于 2012-05-10T05:58:32.003 回答