2016-06-29 6 views
-3

my ViewController все еще отправляет обновление массива, даже если я в другом представлении, что я могу сделать? Вот мой код:Как остановить ViewController в Swift?

import UIKit 
import CoreBluetooth 

class ViewController: UIViewController { 
var audioVibe : AudioVibes! 
var superpowered:Superpowered! 
var displayLink:CADisplayLink! 
var layers:[CALayer]! 
var magnitudeArray : [UInt16] = [0, 0, 0, 0, 0, 0, 0] 


override func viewDidLoad() { 
    super.viewDidLoad() 

    // Setup 8 layers for frequency bars. 
    let color:CGColorRef = UIColor(red: 0, green: 0.6, blue: 0.8, alpha: 1).CGColor 
    layers = [CALayer(), CALayer(), CALayer(), CALayer(), CALayer(), CALayer(), CALayer(), CALayer()] 
    for n in 0...7 { 
     layers[n].backgroundColor = color 
     layers[n].frame = CGRectZero 
     self.view.layer.addSublayer(layers[n]) 
    } 

    superpowered = Superpowered() 

    // A display link calls us on every frame (60 fps). 
    displayLink = CADisplayLink(target: self, selector: #selector(ViewController.onDisplayLink)) 
    displayLink.frameInterval = 1 
    displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes) 
} 

// Gets triggered when you leave the ViewController. 
override func viewWillDisappear(animated: Bool) { 
    superpowered.togglePlayback(); 
    superpowered.moritz(); 
    //delete(superpowered); 
} 

func onDisplayLink() { 
    // Get the frequency values. 
    let magnitudes = UnsafeMutablePointer<Float>.alloc(8) 
    superpowered.getMagnitudes(magnitudes) 

    // Wrapping the UI changes in a CATransaction block like this prevents animation/smoothing. 
    CATransaction.begin() 
    CATransaction.setAnimationDuration(0) 
    CATransaction.setDisableActions(true) 

    // Set the dimension of every frequency bar. 
    let originY:CGFloat = self.view.frame.size.height - 20 
    let width:CGFloat = (self.view.frame.size.width - 47)/5 
    var frame:CGRect = CGRectMake(20, 0, width, 0) 
    for n in 0...4 { 
     frame.size.height = CGFloat(magnitudes[n]) * 2000 
     frame.origin.y = originY - frame.size.height 
     layers[n].frame = frame 
     frame.origin.x += width + 1 
    } 

    // Set the magnitudes in the array. 
    for n in 0...6 { 
     magnitudeArray[n] = UInt16(magnitudes[n] * 32768) 
    } 

    // Update the array in the audioVibe class to trigger the sending command. 
    audioVibe.magnitudeArray = magnitudeArray 

    CATransaction.commit() 

    // Dealloc the magnitudes. 
    magnitudes.dealloc(8) 
} 

} 

Я хочу, чтобы он прекратил делать вещи, как audioVibe.magnitudeArray = magnitudeArray в то время как я не в его взгляде, что я могу сделать?

Спасибо!

+1

Какие функции 'viewWill ...' и 'viewDid ...' вы думали об использовании? – Wain

ответ

0

В вашем методе viewDidLoad вы создаете CADisplayLink и добавляете его в цикл выполнения.

Если вы ничего не сделаете, эта ссылка на отображение останется активной, если вы нажмете на нее еще один контроллер вида.

Вы должны переместить код, создающий ссылку на изображение, и добавить его в цикл выполнения к вашему методу viewWillAppear.

Затем вам нужно добавить код в viewWillDisappear, который удаляет ссылку на изображение из цикла запуска, делает ее недействительной и отменяет ее.

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

+0

Как удалить его из runloop? – BurningTurtle

+0

Взгляните на документы Xcode на CADisplayLink. Ответ будет ** болезненно ** очевидным. –

+0

Или, как указывает cjrieck, вы можете оставить ссылку на изображение на месте и просто приостановить ее. –

0

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

Вы можете приостановить свою ссылку на изображение при переходе от этого вида и возобновить его, когда вернетесь к этому виду, используя свойство paused на CADisplayLink. Вы остановите его в viewWillDisappear и возобновите в viewWillAppear.

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