2016-07-07 4 views
3
class oneViewController: UIViewController{ 
    let sv = UIScrollView(); 
    override func viewDidLoad() { 
    super.viewDidLoad(); 

    sv.frame = CGRectMake(0, 100, screenWidth, screenHeight); 
    sv.backgroundColor = UIColor.clearColor(); 
    sv.contentSize = CGSize(width: sv.frame.size.width*3 ,height: sv.frame.size.height); 
    sv.delegate = self; 
    scrollToContentOffsetX(screenWidth); 
    self.view.addSubview(sv); 
    } 


    func scrollToContentOffsetX(offsetX:CGFloat) { 

     sv.contentOffset.x = offsetX; 
    } 
} 

Я могу прокрутить UIScrollView, он работает. Но я звоню из другого представления, его не работает.Как вызвать contentOffset из другого представления в Swift?

class anthorView: UIView{ 

    override init (frame : CGRect) 
    { 

    super.init(frame : frame) 

     let btnForget = UIButton(frame: CGRectMake(screenWidth-155, txtPWD.frame.origin.y+txtPWD.frame.size.height+5, 70, 30)); 
     btnForget.setTitle("Forget", forState: UIControlState.Normal); 
     btnForget.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal); 
     btnForget.addTarget(self, action: #selector(btnForget_Click), forControlEvents: .TouchUpInside); 
     btnForget.titleLabel!.font = UIFont.systemFontOfSize(14); 
     btnForget.backgroundColor = UIColor.clearColor(); 
     self.addSubview(btnForget); 
    } 

func btnForget_Click(sender: AnyObject) { 

    oneViewController().scrollToContentOffsetX(0); 

    } 
} 

У меня есть точки останова, оба имеют идти функ scrollToContentOffsetX (OffsetX: CGFloat). кто может помочь мне и SRY моего английского

+0

Что такое 'LogInViewController'? Вы поняли, что создали новый экземпляр? –

+0

моя опечатка, я исправил ее, thx. – KennC

ответ

2

Проблемы в коде указываемой @ AminNegm-Авад: в btnForget_Click вы создать полностью новый экземпляр oneViewController, который никогда не будет появляться на экране, и не связаны с существовавшим oneViewController. Вам нужно указать указатель на ваш существующий экземпляр oneViewController в вашем экземпляре anthorView. Обычным способом просмотра «говорить» с контроллером является делегирование протокола. Прочтите об этом самостоятельно; здесь я предлагаю другое решение с закрытием. В любом случае вам нужно будет указать указатель на ваш экземпляр anthorView (давайте объявим его как anthorViewInstance) в oneViewController. Вот изменения, которые вам необходимо добавить в классы

класса anthorView:

var offsetClosure: (CGFloat ->())? 

func btnForget_Click(sender: AnyObject) { 
    // delete previous implementation 
    offsetClosure?(0) 
} 

класса oneViewController:

var anthorViewInstance: anthorView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // some your code... 

    // next line is initialization of anthorView, do it in other place if you wish 
    anthorViewInstance = anthorView(frame: CGRectZero) 
    anthorViewInstance.offsetClosure = 
     { 
      [weak self] 
      offsetX in 
      self?.scrollToContentOffsetX(offsetX) 
     }  
} 

Кроме того, есть локальный случай для этого решения может быть выполнено в вашем случае. Вы можете установить действие кнопки anthorView непосредственно из контроллера просмотра. Для сделать эту кнопку объявим, как собственность в anthorView

класса anthorView:

var btnForget: UIButton! 

super.init(frame : frame) { 
    btnForget = UIButton(frame: CGRectMake(screenWidth-155, txtPWD.frame.origin.y+txtPWD.frame.size.height+5, 70, 30)) 

    // ... other init code 

    // remove btnForget.addTarget line 
} 

// move btnForget_Click method to view controller 

класса oneViewController:

var anthorViewInstance: anthorView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // some your code... 

    // next line is initialization of anthorView, do it in other place if you wish 
    anthorViewInstance = anthorView(frame: CGRectZero) 
    anthorViewInstance.btnForget.addTarget(self, action: #selector(btnForget_Click), forControlEvents: .TouchUpInside) 
} 

func btnForget_Click() { 
    scrollToContentOffsetX(0) 
} 
+1

спасибо, я думаю, мне нужно учить закрытие лучше для меня. – KennC