iOS uygulamasında bir NSUndoManager
kullanmayı deniyorum. İşe alınma işlevselliğini geri aldım, ama yineleme kısmı değil. IOS geliştirmede oldukça yeniyim ve bu ilk kez NSUndoManager
kullanıyorum, bu yüzden muhtemelen önemsiz bir şey.Zorlama NSUndoManager yineleme işlevinin uygulanması
Uygulamam bir resim/not alma uygulamasıdır, bir dizide son on UIImage
s (bunun en verimli yol olup olmadığını bilmiyorum) ile bir geri alma/yineleme yığını var. Kullanıcı geçerli görüntüde değişiklikler yaptığında, eski görüntü yığının üzerine itilir ve dizi zaten on nesneye sahipse dizideki ilk görüntü kaldırılır. Dizideki nesneleri takip etmek ve doğru görüntünün görüntülendiğinden emin olmak için kullandığım int
örnek değişkenim var. Benim kod şöyle görünür:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if (oldImagesArrays.count >= 10) {
[oldImagesArrays removeObjectAtIndex:0];
}
UIImage * currentImage = pageView.canvas.image;
if (currentImage != nil) {
[oldImagesArrays addObject:currentImage];
undoRedoStackIndex = oldImagesArrays.count -1;
}
[...]
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UIImage * currentImage = [oldImagesArrays lastObject];
if (currentImage != pageView.canvas.image) {
[undoManager registerUndoWithTarget:self selector:@selector(resetImage)
object:currentImage];
}
}
// Gets called when the undo button is clicked
- (void)undoDrawing
{
[undoManager undo];
[undoManager registerUndoWithTarget:self
selector:@selector(resetImage)
object:pageView.canvas.image];
undoRedoStackIndex--;
}
// Gets called when the redo button is clicked
- (void)redoDrawing
{
[undoManager redo];
undoRedoStackIndex++;
}
- (void)resetImage
{
NSLog(@"Hello"); // This NSLog message only appears when I click undo.
pageView.canvas.image = [oldImagesArrays objectAtIndex:undoRedoStackIndex];
}
Ben geri alma tıklayın ya resetImage denilen almalısınız yeniden yapma düğmeleri ve benim görüntü yığınında (undoRedoStackIndex geçerli değerini) önceki veya sonraki nesneye geçerli görüntüyü ayarlandığında Bu yalnızca, geri almayı tıklattığımda ancak yinelemediğimde olur.
Çözümler & & || Bunu yapmak için daha iyi yollar takdir edilecektir.
@JoshCaswell Soruma bazı açıklamalar ekledim. – Anders