2016-10-11 5 views
2

Я пытаюсь преобразовать следующий Obj-C код в стремительной 3:Swift 3 преобразования NSClassFromString хочет "" Seperator

UIView *targetView = nil; 
for (UIView *subView in self.navigationController.navigationBar.subviews) { 
    if ([subView isKindOfClass:NSClassFromString(@"UINavigationButton")]) { 
     for (UILabel *label in subView.subviews) { 
      if ([label isKindOfClass:[UILabel class]]) { 
       if ([label.text isEqualToString:"right"]) { 
        targetView = subView; 
        break; 
       } 
      } 
     } 
    } 
} 

CGRect rect = [targetView convertRect:targetView.frame toView:self.view]; 
CGPoint center_you_need = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect)); 

До сих пор у меня есть это:

var targetView: UIView? = nil 
     for subView: UIView in self.navigationController!.navigationBar.subviews { 
      if (subView is NSClassFromString("UINavigationButton")) { 
       for label: UILabel in subView.subviews { 
        if (label is UILabel) { 
         if (label.text! == "right") { 
          targetView = subView 
         } 
        } 
       } 
      } 
     } 
     var rect = targetView!.convertRect(targetView!.frame, to: self.view) 
     var center_you_need = CGPoint(x: rect.midX, y: rect.midY) 

Но это дает мне ошибки: enter image description here

ответ

2

Попробуйте это:

var targetView: UIView? = nil 
for subView in self.navigationController!.navigationBar.subviews { 
    if let navButtonClass = NSClassFromString("UINavigationButton") { 
     if subView.isKind(of: navButtonClass) { 
      for view in subView.subviews { 
       if let label = view as? UILabel { 
        if (label.text! == "right") { 
         targetView = subView 
        } 
       } 
      } 
     } 
    } 
} 
var rect = targetView!.convert(targetView!.frame, to: self.view) 
var center_you_need = CGPoint(x: rect.midX, y: rect.midY) 

Однако вы должны избегать такого кода, когда это возможно. Вы можете сохранить UIBarButtonItem как свойство вашего контроллера, а затем:

  1. Если это кнопка пункт заказ бар, используйте это customView свойство

  2. Если customView равна нулю, вы можете попробовать открыть вид с valueForKey метод:

let targetView = barButtonItem.customView ?? barButtonItem.value(forKey:"view") 
+0

Есть ли другой способ получить позицию центра UIBarButtonItem? – user2722667

+0

Посмотрите на обновленный ответ. Не уверен, что он работает сейчас, но он должен :) – alexburtnik

Смежные вопросы