UITableView перезагружается, когда presentviewcontroller или pushviewcontroller

У меня есть подходящее представление с некоторыми сложными клетками,

Если я нажимаю кнопку в ячейке, если я использую настоящий viewview-контроллер или pushview-контроллер,

он автоматически перезагрузит данные,

как я могу это остановить?

это базовый контроллер

import UIKit

class Controller: UIViewController{
    override func viewDidLoad() {
       super.viewDidLoad();

       initView();
    }

    func initView(){
       self.view.backgroundColor = UIColor.whiteColor();
    }

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
       return UIStatusBarStyle.LightContent;
    }
}

и это второй уровень

import Foundation

class LoadableController: Controller {

    var requestNum                      : Int = 0;

    func loadData(complete: (()->Void)? = nil){
        self.requestComplete();
    }

    func requestComplete(){
        if(self.requestNum == 0){
            requestFinished();
            return;
        }
        self.requestNum = self.requestNum > 0 ? self.requestNum - 1 : 0;
        if(self.requestNum == 0){
            requestFinished();
        }
    }

    func requestFinished(){}
}

это третий уровень

class TableListViewController: LoadableController, UITableViewDelegate, UITableViewDataSource {

    var tableView           : UITableView?;
    var curPage             : Int = 0;
    var totalPage           : Int = 0;

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func initView() {
        super.initView();

        tableView = UITableView();
        tableView!.delegate = self;
        tableView!.dataSource = self;
        tableView!.delaysContentTouches = false;
        tableView!.canCancelContentTouches = true;
        self.view.addSubview(tableView!);
        tableView!.snp_makeConstraints { [unowned self](make) in
            make.edges.equalTo(self.view);
        }

        let header = EGRefresh(refreshingTarget: self, refreshingAction: #selector(self.loadData));
        header.setImages(Global.LOADING_IMAGES, duration: 0.16, forState: .Idle);
        header.setImages(Global.LOADING_IMAGES, duration: 0.16, forState: .Pulling);
        header.setImages(Global.LOADING_IMAGES, duration: 0.16, forState: .WillRefresh);
        header.setImages(Global.LOADING_IMAGES, duration: 0.16, forState: .Refreshing);
        header.lastUpdatedTimeLabel.hidden = true;
        tableView!.mj_header = header;

        let footer = MJRefreshBackNormalFooter.init(refreshingTarget: self, refreshingAction: #selector(self.loadNext));
        tableView!.mj_footer = footer;
    }

    func loadNext(){
        tableView!.mj_footer.endRefreshing();
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("ListCell", forIndexPath: indexPath);
        return cell;
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1;
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1;
    }

    override func requestFinished() {
        tableView!.mj_header.endRefreshing();
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    deinit{
        DDLogInfo("TableListViewController deinit");
    }

}

и вот место, где представление таблицы автоматически перезагружается.

import UIKit

class CircleViewController: TableListViewController {

    override func viewDidLoad() {
        super.viewDidLoad();
    }

    override func initView(){
        super.initView();

        self.title = "Circle";

        let items = ["One", "Two"];
        let segment = UISegmentedControl(items: items);
        segment.selectedSegmentIndex = 0;
        segment.setWidth(80, forSegmentAtIndex: 0);
        segment.setWidth(80, forSegmentAtIndex: 1);
        self.navigationItem.titleView = segment;

        tableView!.estimatedRowHeight = 50;
        tableView!.rowHeight = UITableViewAutomaticDimension;
//        tableView!.contentInset = UIEdgeInsetsMake(Dimens.TopBarHeight, 0, 0, 0);
        tableView!.registerClass(TextOnlyCell.self, forCellReuseIdentifier: "CircleTextOnlyCell");
        tableView!.registerClass(ImageAndPageCell.self, forCellReuseIdentifier: "CircleImageAndPageCell");

        Event.addEventListener(self, selector: #selector(self.goComment(_:)), name: EventType.CIRCLE_COMMENT, object: nil);
    }

    func goComment(ns: NSNotification) {
        let commentView = PostCommentViewController();
        self.navigationController?.pushViewController(commentView, animated: true);
    }

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

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10;
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        tableView.deselectRowAtIndexPath(indexPath, animated: true);
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1;
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("CircleImageAndPageCell", forIndexPath: indexPath) as? ImageAndPageCell;
        if cell == nil {
            cell = ImageAndPageCell.init(style: .Default, reuseIdentifier: "CircleImageAndPageCell");
        }
        let images = [UIImage(named: "b.jpg")!, UIImage(named: "a.jpg")!, UIImage(named: "c.jpg")!, UIImage(named: "a.jpg")!];
        cell?.initView(nil, nickname: "im a nickname", time: "10 min", content: NSMutableAttributedString(string: "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf"), likeNum: 10, commentNum: 12, shareNum: 13, totalLine: 20, images: images, cellIndex: indexPath.row, hasPage: true, pageIcon: UIImage(named: "c.jpg")!, titleStr: "ahahaha");
        return cell!;
    }

    override func loadData(complete: (() -> Void)?) {
        self.requestComplete();
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    deinit {
        Event.removeAllEventListener(self);
        DDLogInfo("CircleViewController deinit");
    }
}

Если goComment будет вызван,

Контроллер вида будет выдвинут,

тогда таблица будет прыгать наверх,

Я добавляю точку останова в cellForRowAtIndexPath,

это называется.

тогда я попробовал настоящий контроллер просмотра,

эта проблема тоже случилась,

хотя я сделал представление viewcontroller во внешнем viewcontroller.


кажется, не перезагрузить данные,

это просто прокрутка к вершине.

1 ответ

Это выглядит как представление таблицы без учета размера uitoolbar (44 балла)

Сохраните смещение табличного представления в prepareForSegue: (сохраните его в свойстве CGPoint)

self.tableViewScrollOffset = self.tableView.contentOffset;

Затем в viewWillAppear: проверьте, было ли оно изменено. Если так, восстановите это.

if (self.tableView.contentOffset.y! = self.tableViewScrollOffset.y) {[self.tableView setContentOffset: self.tableViewScrollOffset]; self.tableViewScrollOffset = CGPointZero; }

Другие вопросы по тегам