2017-02-14 10 views
0

Я пытаюсь нарисовать линию в представлении, но мой код не соответствует требованиям из-за дополнительной ошибки типа. Я новичок в быстром и объективном с и провожу много часов, чтобы найти ответ. Проблема пока не устранена. Итак, может ли кто-нибудь дать ключ, чтобы исправить эту проблему?Значение необязательного типа «CGContext?» не разворачивается

Код:

import UIKit 

class DrawLines: UIView { 

     // Only override draw() if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override func draw(_ rect: CGRect) { 
     //Drawing code 
     // context 
     let context = UIGraphicsGetCurrentContext() 
     CGContextSetLineWidth(context, 3.0) 
     CGContextSetStrokeColorWithColor(context, UIColor.purpleColor().cgColor) 

     //create a path 
     CGContextMoveToPoint(context,0,0) 
     CGContextAddLineToPoint(context,250,320) 

    } 
} 

Ошибка:

enter image description here

+1

Просто нажмите ** Fix-it **, щелкнув по нему. –

+0

@NiravD Спасибо за ответ. Возможно, это поможет решить проблему, но это не решает мою проблему. Можете ли вы рассказать мне причину, которая вызывает эту проблему? – pipi

+0

Что вы подразумеваете под этим, это не решает мою проблему, после того как fix-it удалит ошибку, которую вы сейчас получаете. –

ответ

1

Просто принудительно развернуть контекст, он на 100% безопасен, но решает только одну проблему.

Из документации UIGraphicsGetCurrentContext:

The current graphics context is nil by default. Prior to calling its drawRect: method, view objects push a valid context onto the stack, making it current.

В Swift 3 (предполагается, из draw подписи) синтаксис графики существенно изменился:

class DrawLines: UIView { 

    override func draw(_ rect: CGRect) { 
     let context = UIGraphicsGetCurrentContext()! 
     context.setLineWidth(3.0) 
     context.setStrokeColor(UIColor.purple.cgColor) 

     //create a path 

     // context.beginPath() 
     context.move(to: CGPoint()) 
     context.addLine(to: CGPoint(x:250, y:320)) 
     // context.strokePath() 

    } 
} 

PS: Но чтобы нарисовать линию вы должны раскомментировать линии beginPath() и strokePath().

+0

Я удаляю! от конца UIGraphicsGetCurrentContext вместо добавления? в конце контекста программа может быть выполнена и выполнена. Есть ли какая-то разница, если я так пробую? – pipi

+0

Заключительный восклицательный знак не всегда плох или небезопасен. Согласно документации, абсолютно безопасно добавлять восклицательный знак. Значок вопроса делает/сохраняет его необязательным. – vadian

2

UIGraphicsGetCurrentContext() возвращает необязательно, чтобы использовать его в вашем примере вам нужно вызвать context!. Лучший способ использовать это обернуть его в случае пусть:

if let context = UIGraphicsGetCurrentContext() { 
    // Use context here 
} 

или даже лучше использовать охранник пусть:

guard let context = UIGraphicsGetCurrentContext() else { return } 
// Use context here 
+0

Контекст будет гарантированно существовать при использовании 'UIView' – vadian

2

В этом случае решение заключается в использовании ! при получении контекста:

let context = UIGraphicsGetCurrentContext()! 

Приложение будет разбиваться, когда нет текущего контекста, что означает, что вы сделали что-то очень не так.