[ios] 네이티브 반응 :“다음”키보드 버튼을 누른 후 다음 TextInput을 선택하는 방법?

두 개의 TextInput 필드를 다음과 같이 정의했습니다.

<TextInput 
   style = {styles.titleInput}
   returnKeyType = {"next"}
   autoFocus = {true}
   placeholder = "Title" />
<TextInput
   style = {styles.descriptionInput}          
   multiline = {true}
   maxLength = {200}
   placeholder = "Description" />

그러나 키보드에서 “다음”버튼을 누른 후 반응 네이티브 앱이 두 번째 TextInput 필드로 이동하지 않습니다. 어떻게하면 되나요?

감사!



답변

두 번째 설정 TextInput이전이 초점 TextInputonSubmitEditing트리거됩니다.

이 시도

  1. 두 번째 TextInput에 Ref 추가
    ref={(input) => { this.secondTextInput = input; }}

  2. 첫 번째 TextInput 의 onSubmitEditing 이벤트에 포커스 기능을 바인딩 합니다.
    onSubmitEditing={() => { this.secondTextInput.focus(); }}

  3. 키보드 깜박임을 방지하려면 blurOnSubmit을 false로 설정해야합니다.
    blurOnSubmit={false}

모든 것이 끝나면 다음과 같이 보일 것입니다.

<TextInput
    placeholder="FirstTextInput"
    returnKeyType="next"
    onSubmitEditing={() => { this.secondTextInput.focus(); }}
    blurOnSubmit={false}
/>

<TextInput
    ref={(input) => { this.secondTextInput = input; }}
    placeholder="secondTextInput"
/>


답변

refs를 사용하지 않고도이 작업을 수행 할 수 있습니다 . 참조는 깨지기 쉬운 코드로 이어질 수 있으므로이 방법이 선호 됩니다. 는 문서의 반작용 가능한 다른 솔루션을 찾아 조언을 :

React로 여러 앱을 프로그래밍하지 않은 경우 일반적으로 첫 번째 성향은 앱에서 “일이 발생하도록”참조를 사용하는 것입니다. 이 경우 잠시 시간을내어 구성 요소 계층에서 상태를 소유해야하는 위치에 대해보다 비판적으로 생각하십시오. 종종 해당 상태를 “소유”하는 적절한 장소가 계층 구조에서 더 높은 수준에 있다는 것이 분명해집니다. 상태를 설정하면 “일을 발생시키기”위해 심판을 사용하려는 욕구가 종종 제거됩니다. 대신 데이터 흐름이 일반적으로 목표를 달성합니다.

대신 상태 변수를 사용하여 두 번째 입력 필드에 초점을 맞 춥니 다.

  1. 소품으로 전달할 상태 변수를 다음에 추가하십시오 DescriptionInput.

    initialState() {
      return {
        focusDescriptionInput: false,
      };
    }
  2. 이 상태 변수를 true로 설정하는 핸들러 메소드를 정의하십시오.

    handleTitleInputSubmit() {
      this.setState(focusDescriptionInput: true);
    }
  3. 에 enter / next를 제출 / 타자하면을 TitleInput호출 handleTitleInputSubmit합니다. 이것은 focusDescriptionInputtrue로 설정 됩니다.

    <TextInput
       style = {styles.titleInput}
       returnKeyType = {"next"}
       autoFocus = {true}
       placeholder = "Title"
       onSubmitEditing={this.handleTitleInputSubmit}
    />
  4. DescriptionInputfocusprop은 focusDescriptionInput상태 변수로 설정됩니다 . 따라서 focusDescriptionInput3 단계에서 변경 DescriptionInput하면으로 다시 렌더링됩니다 focus={true}.

    <TextInput
       style = {styles.descriptionInput}
       multiline = {true}
       maxLength = {200}
       placeholder = "Description"
       focus={this.state.focusDescriptionInput}
    />

refs는 더 약한 코드로 이어질 수 있기 때문에 refs를 사용하지 않는 좋은 방법입니다. 🙂

편집 : @LaneRettig에 h / t를 추가하여 React Native TextInput을 추가 소품 및 메소드로 감싸서 응답해야한다고 지적했습니다 focus.

    // Props:
    static propTypes = {
        focus: PropTypes.bool,
    }

    static defaultProps = {
        focus: false,
    }

    // Methods:
    focus() {
        this._component.focus();
    }

    componentWillReceiveProps(nextProps) {
        const {focus} = nextProps;

        focus && this.focus();
    }


답변

React Native 0.36부터 focus()텍스트 입력 노드에서 (다른 답변에서 제안 된) 호출 은 더 이상 지원되지 않습니다. 대신 TextInputStateReact Native 에서 모듈을 사용할 수 있습니다 . 이것을 쉽게하기 위해 다음 도우미 모듈을 만들었습니다.

// TextInputManager
//
// Provides helper functions for managing the focus state of text
// inputs. This is a hack! You are supposed to be able to call
// "focus()" directly on TextInput nodes, but that doesn't seem
// to be working as of ReactNative 0.36
//
import { findNodeHandle } from 'react-native'
import TextInputState from 'react-native/lib/TextInputState'


export function focusTextInput(node) {
  try {
    TextInputState.focusTextInput(findNodeHandle(node))
  } catch(e) {
    console.log("Couldn't focus text input: ", e.message)
  }
}

그런 다음의 focusTextInput“ref” 에서 함수를 호출 할 수 있습니다 TextInput. 예를 들면 다음과 같습니다.

...
<TextInput onSubmit={() => focusTextInput(this.refs.inputB)} />
<TextInput ref="inputB" />
...


답변

래핑 뷰를 바꾸고 TextInput을 가져 오는 것 외에 다른 코드 변경이 필요없는 작은 라이브러리를 만들었습니다.

import { Form, TextInput } from 'react-native-autofocus'

export default () => (
  <Form>
    <TextInput placeholder="test" />
    <TextInput placeholder="test 2" />
  </Form>
)

https://github.com/zackify/react-native-autofocus

https://zach.codes/autofocus-inputs-in-react-native/ 에서 자세히 설명합니다.


답변

내가 함수 구성 요소를 사용하여 내 솔루션을 공유 할 줄 알았는데 … ‘ ‘필요하지 않습니다!

React 16.12.0 및 React Native 0.61.5

다음은 내 구성 요소의 예입니다.

import React, { useRef } from 'react'
...


const MyFormComponent = () => {

  const ref_input2 = useRef();
  const ref_input3 = useRef();

  return (
    <>
      <TextInput
        placeholder="Input1"
        autoFocus={true}
        returnKeyType="next"
        onSubmitEditing={() => ref_input2.current.focus()}
      />
      <TextInput
        placeholder="Input2"
        returnKeyType="next"
        onSubmitEditing={() => ref_input3.current.focus()}
        ref={ref_input2}
      />
      <TextInput
        placeholder="Input3"
        ref={ref_input3}
      />
    </>
  )
}

나는 몰라, 이것이 누군가를 돕기를 바랍니다 =)


답변

반응 네이티브 0.45.1을 사용하여 사용자 이름 TextInput에서 return 키를 누른 후 암호 TextInput에 포커스를 설정하는 데 문제가 발생했습니다.

여기에서 최고 등급의 솔루션을 대부분 시도한 후 github에서 내 요구를 충족시키는 솔루션을 찾았습니다.
https://github.com/shoutem/ui/issues/44#issuecomment-290724642

그것을 요 ​​약하기:

import React, { Component } from 'react';
import { TextInput as RNTextInput } from 'react-native';

export default class TextInput extends Component {
    render() {
        const { props } = this;

        return (
            <RNTextInput
                {...props}
                ref={(input) => props.inputRef && props.inputRef(input)}
            />
        );
    }
}

그리고 나는 이것을 다음과 같이 사용합니다 :

import React, {Component} from 'react';
import {
    View,
} from 'react-native';
import TextInput from "../../components/TextInput";

class Login extends Component {
    constructor(props) {
        super(props);
        this.passTextInput = null
    }

    render() {
        return (
            <View style={{flex:1}}>
                <TextInput
                    style={{flex:1}}
                    placeholder="Username"
                    onSubmitEditing={(event) => {
                        this.passTextInput.focus()
                    }}
                />

                <TextInput
                    style={{flex:1}}
                    placeholder="Password"
                    inputRef={(input) => {
                        this.passTextInput = input
                    }}
                />
            </View>
        )
    }
}


답변

RN 0.50.3의 경우 다음과 같은 방법으로 가능합니다.

<TextInput
  autoFocus={true}
  onSubmitEditing={() => {this.PasswordInputRef._root.focus()}}
/>

<TextInput ref={input => {this.PasswordInputRef = input}} />

이 내용이 표시되어야합니다 .PasswordInputRef. _root .focus ()