2015-11-04 2 views
2

Это своего рода goofy, но у меня есть собственный tableViewCell, который имеет UIScrollView и pageControl. Все работает нормально, хотя я не могу понять, как отправить/передать «pageControll.currentPage», который обновляется в UITableViewCell для моего ViewImageViewController.Передача Int (число) из tableViewCell в новый ViewController

Я не использую «didSelectRowAtIndexPath». Каждая ячейка имеет независимую переменную scrollView и pageControl.

TableViewCell: Работает отлично

class FriendsFeedTableViewCell: UITableViewCell, UIScrollViewDelegate { 

@IBOutlet weak var imageScrollView: UIScrollView! 
@IBOutlet weak var pageControl: UIPageControl! 

func scrollViewDidEndDecelerating(scrollView: UIScrollView) { //current page: works 
    let currentPage = (CGFloat(imageScrollView.contentOffset.x)/CGFloat(userImageView!.frame.size.width)) 
    pageControl.currentPage = Int(currentPage) 
} 
} 

Высота для Cell

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return 470 
} 

TableViewController:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

let cell: FriendsFeedTableViewCell = tableView.dequeueReusableCellWithIdentifier("cell") as! FriendsFeedTableViewCell 

//Grabbing array of images from master Image Array 
//images array will vary 1-3: as of now 
let images = masterImageArray[indexPath.row] 

//ScrollView setup 
let scrollView = cell.imageScrollView 
scrollView.pagingEnabled = true 
scrollView.scrollEnabled = true 
scrollView.tag = indexPath.row 

//setup the image array for scrollView 
var imageViews = [UIImageView]() 
imageViews.append(cell.imageView_1) 
imageViews.append(cell.imageView_2) 
imageViews.append(cell.imageView_3) 

//hidding all ImageViews: will only show if needed 
cell.imageView_1.hidden = true 
cell.imageView_2.hidden = true 
cell.imageView_3.hidden = true 


//tells how many pages will be need 
for var i = 0; i < images.count; i++ { 
    imageViews[i].image = images[i] 
    scrollView.contentSize = CGSize(width: 310 * (i + 1), height: 400) 
    cell.pageControl.numberOfPages = (i + 1) // tells how many pages 
    imageViews[i].hidden = false 
} 

//button: Tells which image in indexPath we want to view 
cell.tapToViewButton.tag = indexPath.row 
cell.tapToViewButton.addTarget(self, action: "buttonPressed:", forControlEvents: .TouchUpInside) 

return cell 
} 

В моей TableViewViewController я использую кнопку, которая когда-то щелкнул он запускает preforemSegueWithIdentifier

func buttonPressed(sender: UIButton){ 
    imageSenderTag = sender.tag   
    self.performSegueWithIdentifier("toViewImageVC", sender: self) 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "toViewImageVC"){ 
     let viewImageVC: ViewImageViewController = segue.destinationViewController as! ViewImageViewController 

     //moves [image] to next VC 
     viewImageVC.imageArrayToPass = masterImageArray[imageSenderTag] 
     //FIXME: need to pass "currentPage" (Int) to newViewController 
    } 
} 

Я не могу понять это. Я ищу, но каждый использует «didSelectRowAtIndexPath», который я не использую.

EDIT: ----------------

Я попытался включить как рекомендацию @ozgur и @Mundi, но это не сработало.

func buttonPressed(sender: UIButton){ 
    self.performSegueWithIdentifier("toViewImageVC", sender: sender) 
} 

пытался: @ozgur рекомендация

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    if (segue.identifier == "toViewImageVC") { 
     let viewImageVC: ViewImageViewController = segue.destinationViewController as! ViewImageViewController 
     viewImageVC.mainUserImageToPass = masterUserPicsArray[imageSenderTag] 
     viewImageVC.imageArrayToPass = masterImageArray[imageSenderTag] 

     if let button = sender as? UIButton { 
      let indexPath = NSIndexPath(forRow: button.tag, inSection: 0) 
      let cell = resultsTable.cellForRowAtIndexPath(indexPath) 

        //ERROR 
      ***viewImageVC.pageNumber = cell!.pageControl.currentPage*** 
     } 

    } 
} 

ОШИБКА: Значение типа "UITableViewCell" имеет ни один из членов '' PageControl

UITableViewCell, конечно, не имеет PageControl. почему это происходит? Это ссылка на информацию о ячейках, верно?

ПРОБОВАЛИ: @ рекомендации Мунди

let button = sender as! UIButton 
    let point = button.convertPoint(CGPointZero, toView: self.resultsTable) 
    let indexPath = self.resultsTable.indexPathForRowAtPoint(point)! 

    let idx = indexPath.row // use this for accessing your image view array 

    if (segue.identifier == "toViewImageVC") { 
     let viewImageVC: ViewImageViewController = segue.destinationViewController as! ViewImageViewController 
     viewImageVC.mainUserImageToPass = masterUserPicsArray[idx] 
     viewImageVC.pageNumber = (sender?.tag)! // EXIBIT: A 
    } 

PageNumber, который отправляется в ViewImageViewController посылает indexPath.row клетки, а не текущая страница UIScrollView в indexPath.row

+0

Какие клетки 'pageControl.currentPage' вы хотите, чтобы перейти к контроллеру вида назначения после того, как была нажата кнопка? – ozgur

+0

Это зависит от того, какая ячейка пользователь просматривает в данный момент и хочет ее подробно просмотреть. Итак, pageControl.tag = indexPath.row – whereisleo

+0

Подождите секунду, поэтому каждая ячейка имеет свой собственный pageControl, и только одна ячейка занимает весь экран за раз? Как вы устанавливаете свойство 'tag' кнопки? Можете ли вы показать нам весь свой код, чтобы лучше понять вашу логику? – ozgur

ответ

1

Если у вас есть только один раздел в вашем виде таблицы;

Во-первых, вы можете передать UIButton нажимается в качестве отправителя Segue в buttonPressed: метода:

func buttonPressed(sender: UIButton) {  
    self.performSegueWithIdentifier("toViewImageVC", sender: sender) 
} 

Во-вторых, вы можете получить ячейку, что принадлежит кнопка используется значение tag в prepareForSegue метода:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let button = sender as? UIButton { 
    let indexPath = NSIndexPath(forRow: button.tag, inSection: 0) 
    let cell = tableView.cellForRowAtIndexPath(indexPath) as! FriendsFeedTableViewCell 
    ... 
    viewImageVC.currentPage = cell!.pageControl.currentPage 
    } 
} 

Если у вас несколько разделов; вы можете получить indexPath описано @Mundi:

let point = button.convertPoint(CGPointZero, toView: tableView) 
let indexPath = tableView.indexPathForRowAtPoint(point)! 
+0

Мой человек! Оно работает!! Странно, как клетка должна быть указана по этому поводу. – whereisleo

0

When звоните self.performSegueWithIdentifier, перейдите sender: sender. Убедитесь, что вы установили tag на текущую страницу.

В prepareForSegue теперь у вас есть доступ к вашему Int следующим образом:

let button = sender as! UIButton 
let point = button.convertPoint(CGPointZero, toView: self.tableView) 
let indexPath = self.tableView.indexPathForRowAtPoint(point)! 
let idx = indexPath.row // use this for accessing your image view arrays 
viewImageVC.currentPage = sender.tag 
+0

привет Мунди, я попробовал свой код (см. Выше), но «viewImageVC.currentPage» - это indexPath.row или номер ячейки , – whereisleo

+0

Благодарим вас за ответ Mundi, включив в свой код ячейку, а затем, в конечном итоге, получив страницуControl.currentPage. – whereisleo

+0

Хорошо для вас. В общем, тем не менее, ** очень плохая практика ** полагаться на иерархию представления для извлечения данных для следующего контроллера. Это нарушает модель ** [MVC] (https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html) ** и может прерываться в любое время. – Mundi